任务并行库用于具有一些并行操作和一些顺序操作的方法

时间:2011-04-14 16:59:40

标签: c# .net task-parallel-library

我有一个方法,其中包含一系列方法调用。其中一些方法调用可以立即发生,一些必须按顺序完成。什么是在任务并行库中实现它的最直接的方法。所有功能都计算繁重,运行时间不到一秒。 即。

public object MyMethod(InputClass myInput)
{
    var result = method1(myInput);
    var result1 = method2(result);
    var result2 = method3(result);
    var finalResult = method4(result1, result2);
    return finalResult;   
}

方法1必须执行1,方法2 +方法3可以并行执行,方法4必须最后执行。

3 个答案:

答案 0 :(得分:4)

您可以使用ContinueWith分配顺序执行,如下所示;

 TaskFactory myFactory = new TaskFactory();

 myFactory.StartNew(method).ContinueWith(delegate
 {
    Task t1 = myFactory.StartNew(method2);
    Task t2 = myFactory.StartNew(method3);

    myFactory.ContinueWhenAll(new [] {t1, t2}, method4);
 });

答案 1 :(得分:2)

我相信这会给你所需的并行度,方法2和3同时执行。

public void MyMethod(InputClass myInput)
{
    TaskFactory<object> t = new TaskFactory<object>();

    var result = method1(myInput);  // Execute Synchronously

    Task<object> t1 = t.StartNew(method2, result); // Create and start new concurrent task
    Task<object> t2 = t.StartNew(method3, result); // Create and start new concurrent task

    t1.Wait(); //Wait for completion
    t2.Wait(); //Wait for completion

    var finalResult = method4(t1.Result, t2.Result);  // Execute Synchronously
}

编辑:使用某些类型进行更新,假设您的所有方法都返回object

答案 2 :(得分:1)

F#中的异步块以及新的Async CTP旨在干净有效地解决此类问题,允许并发管道的外部配置。我知道你说TPL,但我建议你看看。

async {
   let! result = method1 myInput
   let! result1 = method2 result
   let! result2 = method3 result
   let! finalResult = method4 result1 result2
}