我尝试使用 Task.Factory.ContinueWhenAll()几次,目的是仅在所有先行条件运行完成而没有任何错误或取消的情况下调用延续。这样做会导致 ArgumentOutOfRangeException 与消息一起抛出,
例如,代码
var first = Task.Factory.StartNew<MyResult>(
DoSomething,
firstInfo,
tokenSource.Token);
var second = Task.Factory.StartNew<MyResult>(
DoSomethingElse,
mystate,
tokenSource.Token);
var third = Task.Factory.ContinueWhenAll(
new[] { first, second },
DoSomethingNowThatFirstAndSecondAreDone,
tokenSource.Token,
TaskContinuationOptions.OnlyOnRanToCompletion, // not allowed!
TaskScheduler.FromCurrentSynchronizationContext());
TPL不接受。有没有办法使用其他TPL方法来做类似的事情?
最佳答案
似乎没有直接的方法可以做到这一点。我已通过将 OnlyOnRanToCompletion 更改为无并检查异常是否对传递到延续中的每个任务为非空来解决此问题。就像是
private void DoSomethingNowThatFirstAndSecondAreDone(Task<MyResult>[] requestTasks)
{
if (requestTasks.Any(t => t.Exception != null))
return;
// otherwise proceed...
}
可以,但是这似乎不是一个处理多个先例的令人满意的方式,并且打破了 Task.Factory.ContinueWith 单例使用的模式。