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