并行处理的WF序列中的所有活动是否应该是AsyncCodeActivity?

时间:2011-02-24 10:19:29

标签: multithreading workflow-foundation-4

AI有一个WF 4应用程序,其中包含一个序列工作流,该工作流包含一个包含三个连续活动的Sequence的ParallelFor。 这些活动中的第一个是计算绑定的(它生成证书签名请求),第二个是IO绑定(它发送电子邮件),第三个任务也是IO绑定(它更新数据库)。

我最初将这些全部开发为CodeActivities,并且看到他们需要AsyncCodeActivities才能真正在多线程模式下运行。所以我将第一个计算绑定活动修改为AsyncCodeActivity,我可以看到它正在执行多线程。 (至少我可以在Dev机器上观察到更高的处理器利用率,这让我相信它现在正在运行多线程)

但是,后续任务仍为非异步CodeActivities。我的问题如下:

  1. 我是否应该将第二和第三个活动转换为异步(我怀疑会是这种情况)?

  2. 如果没有,当第一个是AsyncCodeActivitiy且第二个和第三个不是时,如何在ParallelFor中执行实际处理?

1 个答案:

答案 0 :(得分:1)

在所有儿童活动并行的情况下,他们同时安排。这意味着放入队列,调度程序将只执行一次。使用异步活动,这意味着启动已安排,它可以生成其他线程,并且在完成信号通知时调度结束部分,并在调度程序到达时真正执行。

实际上,这意味着对于在具有大量其他工作的服务器上执行的工作流,异步活动最适合用于网络或数据库IO等异步IO。在服务器上向已经很繁忙的系统添加多个CPU线程甚至可以减慢速度。如果工作流在客户端上执行,则异步IO和CPU工作都有意义。