posts - 232, comments - 1627, trackbacks - 55, articles - 12
  博客园 :: 首页 ::  :: 联系 :: 订阅 订阅 :: 管理

WF4:同步执行工作流

Posted on 2011-01-08 08:18 生鱼片 阅读(2019) 评论(5) 编辑 收藏

1.在WF4中当我们使用WorkflowApplication来执行工作流的时候,工作流会以异步的方式执行,我们可以简单的写个例子来证明,工作流设置如下:

image

宿主如下:

WorkflowApplication wfApp = new WorkflowApplication(new Workflow1());

            Console.WriteLine("开始启动工作流");
            wfApp.Run();
            Console.WriteLine("工作流执行结束");

执行结果如下:

image

 

2.每个工作流实例会新建一个线程来异步执行,以前我们一般都会使用信号量来控制以达到同步的效果,这我在以前的很多文章中有写到,但这并不是真正的不同执行,在WF4中我们可以通过设置WorkflowApplication的SynchronizationContext属性来工作流同步执行,我们首先要增加一个类,如下:

class SynchronousSynchronizationContext : SynchronizationContext
    {
        public override void Post(SendOrPostCallback d, object state)
        { d(state); }
    }

我们重写了SynchronizationContext的Post方法,如果你反编译该基类的Post方法你就可以看出是通过线程池来实现的 post是从线程池新启动一个线程执行,如下:

public virtual void Post(SendOrPostCallback d, Object state)

{

    ThreadPool.QueueUserWorkItem(new WaitCallback(d), state);

}

我们只需要在工作流设置添加一行代码既可:

wfApp.SynchronizationContext = new SynchronousSynchronizationContext();

结果就不一样了,如下:

image

3.我们来看下Long running的workflow,首先自定义一个Activity,如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Activities;

namespace CaryWFAppTest1
{

    public sealed class LongRunningActivity : NativeActivity
    {
        protected override bool CanInduceIdle
        {
            get { return true; }
        }
        protected override void Execute(NativeActivityContext context)
        {
            Console.WriteLine("执行LongRunning逻辑,等待完成...");
            context.CreateBookmark("激活", CompletedCallBack);
        }

        private void CompletedCallBack(NativeActivityContext context, Bookmark bookmark, object value)
        {
            Console.WriteLine("LongRunning逻辑执行完成");
        }
    }
}

工作流设计如下:

image

宿主代码如下:

WorkflowApplication wfApp = new WorkflowApplication(new Workflow1());
           wfApp.SynchronizationContext = new SynchronousSynchronizationContext();

           wfApp.Idle = e => Console.WriteLine("触发工作流空闲事件");
           Console.WriteLine("开始启动工作流");
           wfApp.Run();
           Console.WriteLine("工作流进入空闲状态");
           Console.WriteLine();
           Console.WriteLine("开始恢复工作流");
           Console.WriteLine("恢复工作流: {0}", wfApp.ResumeBookmark("激活", null));
           Console.WriteLine("工作流执行结束");

           Console.ReadLine();

执行结果如下:

image

作者:生鱼片
         
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

Feedback

#1楼  回复 引用 查看   

2011-01-08 09:49 by 麒麟      
顶下,楼主很久没写WF4的文章咯!

#2楼  回复 引用 查看   

2011-01-08 22:03 by Tony Zhou      
wf这东西用的多吗

#3楼  回复 引用 查看   

2011-01-09 11:17 by _龙猫      
在4.0之前,是通过添加ManualWorkflowSchedulerService服务来实现线程同步的。
不知道4.0里还有该服务吗?

#4楼  回复 引用 查看   

2011-01-14 16:40 by 刘华军      
LZ,这个对Delay没有用,有什么其它方法?

#5楼  回复 引用 查看   

2011-01-14 21:06 by BillyQing      
具体有什么应用场景嚒