我正在 WF 4 中创建一个工作流,其中我有一个ParallelForeach
迭代项目集合的活动。对于集合中的每个项目,我执行自定义异步活动以并行处理多个项目。
上面的解决方案对我有用,但我担心使用的线程数,因为每个异步活动实例都是在自己的线程上执行的。有没有办法配置/控制在上述机制中执行 parallelForeach 活动时启动的线程数?
我正在 WF 4 中创建一个工作流,其中我有一个ParallelForeach
迭代项目集合的活动。对于集合中的每个项目,我执行自定义异步活动以并行处理多个项目。
上面的解决方案对我有用,但我担心使用的线程数,因为每个异步活动实例都是在自己的线程上执行的。有没有办法配置/控制在上述机制中执行 parallelForeach 活动时启动的线程数?
因为每个异步活动实例都在自己的线程上执行。谁说? 当然不是文档。
ParallelForEach 枚举它的值并为它枚举的每个值调度 Body。它只安排身体。身体如何执行取决于身体是否闲置。如果 Body 没有空闲,它会以相反的顺序执行,因为计划的活动作为堆栈处理,最后一个计划的活动首先执行。
例如,如果您在 ParallelForEach 中有一个 {1,2,3,4} 的集合,并使用 WriteLine 作为主体来写出值。您在控制台中打印了 4, 3, 2, 1。这是因为 WriteLine 不会空闲,因此在安排了 4 个 WriteLine 活动后,它们使用堆栈行为(先进后出)执行。
仅当 Activity 创建书签并处于空闲状态时,才会发生并行执行。即使这样,两个活动实际上并没有同时执行——一个或多个刚刚停止执行,允许其他活动按顺序运行。可以理解的混乱,给定的名字,但就是这样。
In any event, when you're relying on the framework to parallelize for you, don't worry about how many threads they're using. They probably have everything under control. Until you know they don't.
Will 是正确的,ParallelForEach 不需要为每个分支创建一个新线程。如果您在应该发生在 AsyncCodeActivity 中的代码中执行阻塞 I/O,这样您就不会不必要地阻塞。如果您希望 CPU 密集型工作与其他活动并行运行,您需要将其包装在 AsyncCodeActivity 中或使用 InvokeMethod { RunAsynchronously = true} 在这种情况下,框架将负责在后台线程上运行工作。
SynchronizationContext 扩展点适用于需要 WF 集成的特定现有线程模型的情况。这方面的主要示例包括 ASP.NET 的线程环境和 Windows Presentation Foundation/WinForms(例如,如果您希望活动正常工作)。