我应该如何设计我的工作流程,以便任务可以并行运行

时间:2011-07-29 00:47:39

标签: .net-4.0 parallel-processing workflow-foundation-4

如何设计并行处理工作流程

我有关于数据分析的情况。

基本上有四个步骤:

  1. 从队列中读取任务或通过API(可能是Web服务)接收消息以触发服务

  2. 根据步骤1中的参数向远程服务提交请求

  3. 等待远程服务完成并下载

  4. 对从步骤3下载的数据执行处理

  5. 上面的四个步骤看起来像一个序列工作流程。 我的问题是我该如何扩展它。

    每天我可能需要执行数百到数千个此任务。 如果我可以并行完成,那将会有很大帮助。 例如,一次运行20个任务。

    那么我们可以配置Windows工作流基础来并行运行吗?

    感谢。

2 个答案:

答案 0 :(得分:0)

您可能想要使用pfx(http://www.albahari.com/threading/part5.aspx),然后您可以控制要获取的线程数,并使用PLINQ我觉得有用。

所以,你循环遍历网址列表,也许是从文件或数据库中读取,然后在你的选择中你可以调用一个函数来进行处理。

例如,如果您可以详细了解是否要将提取和处理设置在不同的线程上,则可能更容易提供更完整的答案。

<强>更新

我就是这样做的,但我也在使用ConcurrentQueuehttp://www.codethinked.com/net-40-and-system_collections_concurrent_concurrentqueue),所以我可以在读取数据时将数据放入队列。

这样每个线程都可以安全地出列,而不必担心必须锁定你的收藏。

            Parallel.For(0, queue.Count, new ParallelOptions() { MaxDegreeOfParallelism = 20 },
                (j) =>
                {
                   String i;
                   queue.TryDequeue(out i);
                   // call out to URL
                   // process data
                }
            });

您可能希望将数据放入另一个并发集合中并单独处理,这取决于您的应用程序需求。

答案 1 :(得分:0)

根据您的任务和工作流的建模方式,您可以使用Parallel活动并为要执行的不同任务创建不同的分支。每个分支都有自己的逻辑,WF运行时将启动第二个WCF请求,以便在等待第一个响应时立即检索数据。这要求您明确地对分支的数量建模,但允许在每个分支中进行不同的活动。

但是从您的描述中可以看出,您对每个任务都有相同的步骤,在这种情况下,您可以使用ParallelForEach活动对其进行建模,并对一组任务进行迭代。每个任务对象都需要包含用于请求的所有信息。这要求每个任务都有相同的步骤,但您可以根据需要输入任意数量的任务。

最有效的方法取决于您的情况。