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

本文关键字:顺序操作 方法 并行操作 用于 具有一 任务 并行 | 更新日期: 2023-09-27 17:50:07

我有一个方法,其中包含一系列方法调用。其中一些方法调用可以立即发生,而另一些则必须依次执行。在任务并行库中实现这一点的最直接的方法是什么?所有函数的计算量都很大,运行时间不到一秒。例如

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

Method1必须先执行,method2 + method3可以并行执行,method4必须最后执行

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

您可以使用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);
 });

我相信这将提供您所需要的并行性级别,方法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

f#中的异步块,以及新的异步CTP都是为了干净有效地解决这些问题而设计的,允许外部配置并发管道。我知道你说的是TPL,但我还是建议你看一看。

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