C# 使用task.WaitAny()获取已完成的任务Id
我知道我的目标可以通过使用Task.wheny来实现,但如果可以避免,我不会处理async Wait,以防止死锁。我有以下代码: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
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不是一个异步操作?正确。它同步地阻塞您所拥有的异步任务。你就是这样陷入僵局的。