2014-10-22 130 views
3

我有两个ContinueWith任务。第一个处理任务成功完成时的情况,第二个处理失败时的情况。 然后我等到他们中的一个完成。 的示例代码如下: Task.WaitAll和取消的任务

var task = Task.Factory.StartNew(() => { Console.WriteLine("Task is finished"); }); 
var success = task.ContinueWith(
    t => Console.WriteLine("Success") 
    , TaskContinuationOptions.OnlyOnRanToCompletion 
    ); 
var failed = task.ContinueWith(
    t => Console.WriteLine("Failed") 
    , TaskContinuationOptions.NotOnRanToCompletion 
    ); 

try 
{ 
    Task.WaitAll(success, failed); 
} 
catch (AggregateException ex) 
{ 
    Console.WriteLine(ex.InnerException.Message); 
} 

我的问题是,是否有可能重写,以避免TaskCanceledException提高?

+2

'WaitAll'不等到一个完成,那就是'WaitAny'。 – 2014-10-22 07:48:43

+0

了WaitAny将在当他们中的一个,而无需等待时的实际行动将完成将被取消时刻通过 – 2014-10-22 07:51:04

+0

是的,我只是在校正时,路人阅读和思考'WaitAll'等待一个来完成,而不是术语另一个。 – 2014-10-22 07:53:20

回答

2

当你想拥有成功和失败处理,我看不出有任何理由让他们在不同的ContinueWith()电话。一个电话,这总是会发生应该足够:

var continuation = task.ContinueWith(
    t => 
    { 
     if (t.IsFaulted) 
      Console.WriteLine("Failed"); 
     else 
      Console.WriteLine("Success"); 
    }); 

continuation.Wait(); 

假设task将永远不会被取消,这将表现得几乎与您的原代码。

+0

谢谢svick,通常我使用你描述的方法。但有时有理由说,为什么最好有两个不同的'ContinueWith',例如当“successWith'应该有它自己的'ContinueWith'时,我们有”成功“和”失败“的不同调度器。ContinueWith ' – 2014-10-25 20:28:20