【发布时间】:2011-04-11 19:30:30
【问题描述】:
我对如何使用带有条件延续的任务感到有些困惑。
如果我有一个任务,然后我想继续处理成功和错误的任务,然后等待这些任务完成。
void FunctionThrows() {throw new Exception("faulted");}
static void MyTest()
{
var taskThrows = Task.Factory.StartNew(() => FunctionThrows());
var onSuccess = taskThrows.ContinueWith(
prev => Console.WriteLine("success"),
TaskContinuationOptions.OnlyOnRanToCompleted);
var onError = taskThrows.ContinueWith(
prev => Console.WriteLine(prev.Exception),
TaskContinuationOptions.OnlyOnFaulted);
//so far, so good
//this throws because onSuccess was cancelled before it was started
Task.WaitAll(onSuccess, onError);
}
这是进行任务成功/失败分支的首选方式吗?另外,我应该如何加入所有这些任务,假设我创建了一长串延续,每个都有自己的错误处理。
//for example
var task1 = Task.Factory.StartNew(() => ...)
var task1Error = task1.ContinueWith( //on faulted
var task2 = task1.ContinueWith( //on success
var task2Error = task2.ContinueWith( //on faulted
var task3 = task2.ContinueWith( //on success
//etc
在这些总是抛出调用WaitAll,因为某些延续将由于TaskContinuationOptions 而被取消,并且在取消的任务上调用Wait 抛出。
如何在不出现“任务已取消”异常的情况下加入这些?
【问题讨论】:
标签: c# .net-4.0 task-parallel-library