任务并行库用于具有一些并行操作和一些顺序操作的方法
本文关键字:顺序操作 方法 并行操作 用于 具有一 任务 并行 | 更新日期: 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
}