您的位置:首页 > 其它

WF4.0与多线程

2016-02-15 22:07 253 查看
在WF4.0中,可以使用WorkflowApplication与WorkflowInvoker创建并启动实例.

但两者在宿主中的线程方式是不一样的

使用WorkflowInvoker启动工作流时,工作流将附加到宿主的线程中执行

使用WorkflowApplication启动工作流,工作流实例将在宿主线程之外的另一个线程中运行,使用的是线程池方式

现在用实例证明:

工作流流程代码:

<span style="font-size:18px;">namespace workflow
{
public sealed class TestActivity : CodeActivity
{
// 派生并从 Execute 方法返回该值。
protected override void Execute(CodeActivityContext context)
{
for (int i = 1; i <= 10; i++)
{
System.Threading.Thread.Sleep(500);
Console.WriteLine(i);
}

}
}
}
</span>


 WorkflowInvoker启动流程代码:

        
static void Main(string[] args)
{
Console.WriteLine("流程开始");
#region WorkflowInvoker调用代码
WorkflowInvoker.Invoke(new TestActivity());
WorkflowInvoker.Invoke(new TestActivity());
#endregion
Console.WriteLine("流程结束");
}


结果:



WorkflowApplication 启动流程代码:

<span style="font-size:18px;">static void Main(string[] args)
{
Console.WriteLine("流程开始");
workflow.TestActivity  activity = new TestActivity();

WorkflowApplication application = new WorkflowApplication(activity);
WorkflowApplication application1 = new WorkflowApplication(activity);
application.Run();    //流程触发启动
application1.Run();

Console.WriteLine("流程结束");
Console.ReadKey();
}
}  </span>


结果:



多线程的另一方面理解:

Main函数和工作流流程是两个线程,Main函数是主线程,工作流流程是辅线程。

现在有一种情况是,在主线程的运行期间想要运行工作流程序,针对这种情况运用的是线程阻塞,工作流运行完后,再恢复线程。代码如下:

主线程:

        
static void Main(string[] args)
{
AutoResetEvent instanceUnloaded = new AutoResetEvent(false);
workflow.TestActivity  activity = new TestActivity();
WorkflowApplication application = new WorkflowApplication(
activity);
#region 回调函数(工作流流程出现的一些状态后执行的方法,例如工作流空闲、卸载、终止等)
application.Completed = (workflowApplicationCompletedEventArgs) =>
{
Console.WriteLine("\nWorkflowApplication has Completed in the {0} state.", workflowApplicationCompletedEventArgs.CompletionState);
};
application.PersistableIdle = (e) =>
{
return PersistableIdleAction.Unload;
};
application.Unloaded = (workflowApplicationEventArgs) =>
{
instanceUnloaded.Set();  //恢复线程
Console.WriteLine("WorkflowApplication has Unloaded\n");
};
application.OnUnhandledException = (ex) =>
{
Console.Write("Exception");
return UnhandledExceptionAction.Terminate;
};
#endregion
application.Run();    //流程触发启动
//线程阻塞
Console.WriteLine("主线程线程阻塞,辅线程(工作流线程)开始运行");
instanceUnloaded.WaitOne();
Console.WriteLine("主线程恢复");
Console.ReadKey();
}


辅线程(工作流流程线程还是以上的代码)

结果是:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  多线程 WF4.0