C# 使用task.WaitAny()获取已完成的任务Id

C# 使用task.WaitAny()获取已完成的任务Id,c#,.net,multithreading,task-parallel-library,task,C#,.net,Multithreading,Task Parallel Library,Task,我知道我的目标可以通过使用Task.wheny来实现,但如果可以避免,我不会处理async Wait,以防止死锁。我有以下代码: try { Task.WaitAny(this.Tasks.ToArray()); foreach (var task in this.Tasks) { if (task.IsFaulted || task.IsCanceled) { if (task.Exception.InnerException is

我知道我的目标可以通过使用Task.wheny来实现,但如果可以避免,我不会处理async Wait,以防止死锁。我有以下代码:

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?获得此问题的解决方案

来自Task.WaitAny的:

返回值

类型:System.Int32

任务数组中已完成任务对象的索引

所以你可以这样做:

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

返回值

类型:System.Int32

任务数组中已完成任务对象的索引

所以你可以这样做:

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

通过使用WaitAny而不是WhenAny同步等待异步操作,这正是导致死锁的原因。通过异步执行调用堆栈上的所有操作可以避免死锁。但就我所知,WaitAny不是一个异步操作?正确。它同步地阻塞您所拥有的异步任务。这就是进入死锁的方式。使用WaitAny而不是WhenAny同步等待异步操作,这正是导致死锁的原因。通过异步执行调用堆栈上的所有操作可以避免死锁。但就我所知,WaitAny不是一个异步操作?正确。它同步地阻塞您所拥有的异步任务。你就是这样陷入僵局的。