代码之家  ›  专栏  ›  技术社区  ›  Jeff LaFay

我的工作流书签选取触发器有什么问题?

  •  1
  • Jeff LaFay  · 技术社区  · 14 年前

    我有一个 NativeActivity 我编写的派生活动,它使用书签作为pick分支的触发器。我用在MSDN上找到的东西写了这个来触发分支。分支包含消防服务通过发送活动回调到远程客户端的活动。如果我为触发器设置了延迟,回调就会成功地触发到客户机。如果我使用代码活动,pick分支活动不会启动。

    public sealed class UpdateListener : NativeActivity<ClientUpdate>
    {
        [RequiredArgument]
        public InArgument<string>     BookmarkName { get; set; }
    
        protected override void Execute(NativeActivityContext context)
        {
            context.CreateBookmark(BookmarkName.Get(context),
                        new BookmarkCallback(this.OnResumeBookmark));
        }
    
    
        protected override bool CanInduceIdle
        {
            get { return true; }
        }
    
    
        public void OnResumeBookmark(NativeActivityContext context, Bookmark bookmark, object obj )
        {
            Result.Set(context, (ClientUpdate)obj);
        }
    }
    

    ClientUpdate 客户端更新

    出于某种原因,这似乎是正确的,但感觉是错误的。我不确定是否应该以不同的方式编写活动,以满足WF服务的需要。

    2 回复  |  直到 14 年前
        1
  •  1
  •   user1228 user1228    14 年前

    我认为如果您创建了一个扩展(实现IWorkflowInstanceExtension)来执行您的操作,您的意图会更清楚一些。

    例如:

    public sealed class AsyncWorkExtension 
        : IWorkflowInstanceExtension
    {
        // only one extension per workflow
        private WorkflowInstanceProxy _proxy;
        private Bookmark _lastBookmark;
    
        /// <summary>
        /// Request the extension does some work for an activity
        /// during which the activity will idle the workflow
        /// </summary>
        /// <param name="toResumeMe"></param>
        public void DoWork(Bookmark toResumeMe)
        {
            _lastBookmark = toResumeMe;
            // imagine I kick off some async op here
            // when complete system calls WorkCompleted below
            // NOTE:  you CANNOT block here or you block the WF!
        }
    
        /// <summary>
        /// Called by the system when long-running work is complete
        /// </summary>
        /// <param name="result"></param>
        internal void WorkCompleted(object result)
        {
            //NOT good practice!  example only
            //this leaks resources search APM for details
            _proxy.BeginResumeBookmark(_lastBookmark, result, null, null);
        }
    
        /// <summary>
        /// When implemented, returns any additional extensions 
        /// the implementing class requires.
        /// </summary>
        /// <returns>
        /// A collection of additional workflow extensions.
        /// </returns>
        IEnumerable<object> IWorkflowInstanceExtension
            .GetAdditionalExtensions()
        {
            return new object[0];
        }
    
        /// <summary>
        /// Sets the specified target 
        /// <see cref="WorkflowInstanceProxy"/>.
        /// </summary>
        /// <param name="instance">The target workflow instance to set.</param>
        void IWorkflowInstanceExtension
            .SetInstance(WorkflowInstanceProxy instance)
        {
            _proxy = instance;
        }
    }
    

     var ext = context.GetExtension<AsyncWorkExtension>();
     var bookmark = context.CreateBookmark(BookmarkCallback);
     ext.DoWork(bookmark);
     return;
    

    这种方式更加明确(而不是使用书签名来向“外部”世界传达含义),并且如果您需要发送比书签名更多的信息,那么这种方式更容易扩展。

        2
  •  0
  •   Maurice    14 年前