2013-07-31 53 views
1

我写应该执行的基础上,先行任务的成功或失败的任务序列。但是,其中一个任务意外执行,即使其先行任务未执行。ContinueWith任务意外执行

的步骤是,我输入一些数据。如果成功,我开始保存,然后计算。如果导入失败,我想处理异常。

这里是我可以复制它的简单代码:

var importTask = new Task(() => { 
    Console.WriteLine("import"); 
    // Force an exception 
    throw new Exception("FAIL"); 
}); 

var saveTask = importTask.ContinueWith(task => { 
    Console.WriteLine("save"); 
}, TaskContinuationOptions.NotOnFaulted); 

var calcTask = saveTask.ContinueWith(task => { 
    Console.WriteLine("calc"); 
}); 

var errorTask = importTask.ContinueWith(task => { 
    Console.WriteLine("error"); 
    Console.WriteLine(task.Exception.InnerException.Message); 
}, TaskContinuationOptions.OnlyOnFaulted); 

importTask.Start(); 

从这个输出是:

进口

错误

失败

我认为应该calcTask后saveTask执行。但是即使saveTask没有,它也会执行。有趣的是,在calcTask中,task.IsCanceled == true。

为什么计算任务的执行?

回答

2

我相信你有

TaskContinuationOptions.OnlyOnRanToCompletion 

添加到每个后续项目,以确保它们不会在来路运行,以完成除运行,否则它是公平的游戏,它只会按顺序运行天气失败或运行。

我用这个,它似乎是你想要的回应。

var calcTask = saveTask.ContinueWith(task => 
{ 
    Console.WriteLine("calc"); 
}, TaskContinuationOptions.OnlyOnRanToCompletion); 
1

使用此:

var importTask = new Task(() => 
{ 
    Console.WriteLine("import"); 
    // Force an exception 
    throw new Exception("FAIL"); 
}); 

var saveTask = importTask.ContinueWith(task => 
{ 
    Console.WriteLine("save"); 
}, TaskContinuationOptions.NotOnFaulted); 

var calcTask = saveTask.ContinueWith(task => 
{ 
    Console.WriteLine("calc"); 
}, TaskContinuationOptions.OnlyOnRanToCompletion); 

var errorTask = importTask.ContinueWith(task => 
{ 
    Console.WriteLine("error"); 
    Console.WriteLine(task.Exception.InnerException.Message); 
}, TaskContinuationOptions.OnlyOnFaulted); 

calcTask使用TaskContinuationOptions.NotOnFaulted不会起作用,因为saveTask不抛出任何异常。您必须使用TaskContinuationOptions.OnlyOnRanToCompletion指定,如果saveTask正确执行calcTask只应执行。你可以找到关于TaskContinuationOptions的更多信息:

http://msdn.microsoft.com/en-us/library/ee372288.aspx