如何执行System.Threading.Task作为两个或更多其他任务结果的延续?
public Task<FinalResult> RunStepsAsync()
{
Task<Step1Result> task1 = Task<Step1Result>.Factory.StartNew(Step1);
// Use the result of step 1 in steps 2A and 2B
Task<Step2AResult> task2A = task1.ContinueWith(t1 => Step2A(t1.Result));
Task<Step2BResult> task2B = task1.ContinueWith(t1 => Step2B(t1.Result));
// Now merge the results of steps 2A and 2B in step 3
Task<FinalResult> task3 = task2A
.ContinueWith(
t2A => task2B.ContinueWith(
t2B => Step3(t2A.Result, t2B.Result)))
.Unwrap();
return task3;
}
这样可行,但是双重ContinueWith似乎效率低下。有没有更好的方法来实现这一点,也许使用TaskCompletionSource? (我不想使用锁或Task.WaitAll。)
答案 0 :(得分:20)
使用TaskFactory.ContinueWhenAll。
class Step1Result {}
class Step2AResult
{
public Step2AResult(Step1Result result) {}
}
class Step2BResult
{
public Step2BResult(Step1Result result) {}
}
class FinalResult
{
public FinalResult(Step2AResult step2AResult, Step2BResult step2BResult) {}
}
public Task<FinalResult> RunStepsAsync()
{
var task1 = Task<Step1Result>.Factory.StartNew(() => new Step1Result());
// Use the result of step 1 in steps 2A and 2B
var task2A = task1.ContinueWith(t1 => new Step2AResult(t1.Result));
var task2B = task1.ContinueWith(t1 => new Step2BResult(t1.Result));
// Now merge the results of steps 2A and 2B in step 3
return Task <FinalResult>
.Factory
.ContinueWhenAll(new Task[] { task2A, task2B }, tasks => new FinalResult(task2A.Result, task2B.Result));
}