使用Task.WaitAny()获取已完成的任务ID

时间:2015-10-29 14:29:28

标签: c# .net multithreading task-parallel-library task

我知道我的目标可以通过使用Task.WhenAny()实现,但我不会处理异步等待,如果我可以避免它,以防止死锁。我有以下代码:

try
{
   Task.WaitAny(this.Tasks.ToArray());
   foreach (var task in this.Tasks)
   {
      if (task.IsFaulted || task.IsCanceled)
      {
         if (task.Exception.InnerException is OperationCanceledException)
         {

         }
      }
   }                    
}  
catch (OperationCanceledException o)
{
   // Handling cancelled tasks
}              
catch (Exception e)
{
   // Handling faulted tasks
}

我想要确切地知道我的任务的ID,它已经出现故障,或者我的任务的ID被取消了。我试图这样做,如上面的try块所示,但这不是一个解决方案,因为它也会为之前被取消的任务抛出异常。我可以使用Task.WaitAny()获得此问题的解决方案吗?

1 个答案:

答案 0 :(得分:4)

来自Task.WaitAny的{​​{3}}:

  

返回值

     

输入:System.Int32

     

tasks数组中已完成的Task对象的索引。

所以你可以这样做:

var taskIndex = Task.WaitAny(this.Tasks.ToArray());
var task = this.Tasks[taskIndex];