我正在WF 4中创建一个工作流程,其中我有一个ParallelForeach
活动,它迭代一组项目。对于集合中的每个项目,我执行自定义异步活动以并行处理多个项目。
上面的解决方案对我有用,但我担心自从每个异步活动实例在自己的线程上执行以来所使用的线程数。有没有办法配置/控制在上述机制中执行parallelForeach活动时启动的线程数?
答案 0 :(得分:2)
因为每个异步活动实例都在自己的线程上执行。谁说? Certainly not the docs.
ParallelForEach枚举其值并为其枚举的每个值计划Body。它只安排身体。身体如何执行取决于身体是否空闲。 如果Body没有空闲,它将以相反的顺序执行,因为计划的活动作为堆栈处理,最后执行的最后一个计划活动。
例如,如果ParallelForEach中有一个{1,2,3,4}的集合,并使用WriteLine作为正文来写出值。您在控制台中打印出4,3,2,1。这是因为WriteLine不会空闲,因此在4个WriteLine活动被安排后, 它们使用堆栈行为执行(先排在后面) 。
只有当Activity创建书签并进入空闲状态时,才会执行并行执行。即使这样,两个活动实际上并没有同时执行 - 一个或多个活动刚刚停止执行,允许其他活动按顺序运行。考虑到这个名字,理解上令人困惑,但就是这样。
无论如何,当您依靠框架为您进行并行化时,不要担心他们使用了多少个线程。他们可能掌控一切。直到你知道他们没有。
答案 1 :(得分:0)
Will是正确的,ParallelForEach不需要为每个分支创建一个新线程。如果您正在阻止在AsyncCodeActivity中出现的代码中的I / O,那么您不会不必要地阻塞。如果您希望CPU绑定工作与其他活动并行运行,您需要将其包装在AsyncCodeActivity中或使用InvokeMethod {RunAsynchronously = true},在这种情况下,框架将负责在后台线程上运行工作。
SynchronizationContext扩展点适用于您需要与WF集成的特定现有线程模型的情况。这方面的主要示例包括ASP.NET的线程环境和Windows Presentation Foundation / WinForms(例如,如果您希望活动正常工作)。