tasked,基于微软并行计算的工作流解决方案 (2) Tasked based Parallel Activity

上一节我们做了个简单的测试证明了Parallel并不是真正意义上的并行工作流,并且分析了它的缺陷。
在.net framework 4里面有很多关于并行计算的组件,现在我们就要利用System.Threading.Tasks.Task类型来实现并行的分支。
在此我们不对此类型做解释,有问题的朋友可以参考MSDN或者发邮件给我。
我们重写一下PartDBReplicationActivity,
public class PartDBReplicationAsyncActivity : AsyncCodeActivity { public InOutArgument OrderInActivity { get; set; }
protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state) { Order order = context.GetValue(OrderInActivity); Task worker = Task.Factory.StartNew( (o) => { order.Status = OrderStatus.InProcess; //Call Part service Thread.Sleep(5000); }, state); worker.ContinueWith(task => callback(task)); return worker; }
protected override void EndExecute(AsyncCodeActivityContext context, IAsyncResult result) { } }
再看新的VehicleReplicationAsyncActivity
public class VehicleReplicationAsyncActivity : AsyncCodeActivity { public InOutArgument OrderInActivity { get; set; }
protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state) { //Console.WriteLine("VehicleDBReplication AsyncActivity starts at:{0} \r\n", DateTime.Now.ToString()); Order order = context.GetValue(OrderInActivity); Task worker = Task.Factory.StartNew( (o) => { order.Status = OrderStatus.InProcess; //Call Part service Thread.Sleep(5000); //Console.WriteLine("VehicleDBReplication AsyncActivity ends at {0}.\r\n", DateTime.Now.ToString()); }, state); worker.ContinueWith(task => callback(task)); return worker; }
protected override void EndExecute(AsyncCodeActivityContext context, IAsyncResult result) {
} }
我们修改main里面的代码让它执行新的Close Order流程
class Program { static void Main(string[] args) { DateTime dtStart = DateTime.Now; Console.WriteLine("CloseOrder workflow starts at:{0}", dtStart); Console.WriteLine("--------------------------------------------------------------"); //WorkflowInvoker.Invoke(new CloseOrderWorkflow()); WorkflowInvoker.Invoke(new CloseOrderParallelWorkflow()); Console.WriteLine("--------------------------------------------------------------"); DateTime dtEnd = DateTime.Now; Console.WriteLine("CloseOrder workflow ends at:{0}", dtEnd.ToString()); Console.WriteLine("Total time elapsed in seconds :{0}",( dtEnd - dtStart).Seconds.ToString()); Console.Read(); } }
看结果
tasked,基于微软并行计算的工作流解决方案 (2) Tasked based Parallel Activity
现在整个流程只花了5秒钟,我们初步完成基于微软并行解决方案的并行工作流。
并发工作流要求分支之间线程安全,业务上没有耦合和次序关系。
但是我们实现的基于并行计算并发工作流活动也存在一些缺陷:可扩展性不高,开发人员过于底层细节的关注,封装性不好等等..
后面的任务是要完成一个真正意义上的可扩展的并发Parallel Activity,用户只要拖拽这个工作流活动到Visual Studio里面,设置一些参数,比如绑定处理的真正任务,那么就无需和Parallel.Task底层对象打交道,只需要对业务逻辑的实现。
敬请关注。

Tags:  云计算与并行计算 并行计算实验报告 并行计算云计算 并行计算 tasked

延伸阅读

最新评论

发表评论