我正在从三个不同的任务中抛出OperationCanceledException
,每个任务都有轻微的差异,如下面的代码:
static async Task ThrowCancellationException()
{
throw new OperationCanceledException();
}
static void Main(string[] args)
{
var t1 = new Task(() => throw new OperationCanceledException());
t1.Start();
try { t1.Wait(); } catch { }
Task t2 = new Task(async () => throw new OperationCanceledException());
t2.Start();
try { t2.Wait(); } catch { }
Task t3 = ThrowCancellationException();
Console.WriteLine(t1.Status); // prints Faulted
Console.WriteLine(t2.Status); // prints RanToCompletion
Console.WriteLine(t3.Status); // prints Canceled
}
我的问题是:
为什么每个任务的状态都不同?
我可以理解标有async
的代码/lambda和没有标记async
的lambda之间存在差异,但即使是运行相同代码的async
lambda和async
方法之间的状态也不同。
new Task
的重载采用Action
而不是Func<Task>
,这意味着您的async
lambda 版本相当于传递一个async void
方法而不是async Task
方法。如果要传递返回Task
的委托,请使用Task.Run
:它有一个重载,接受Func<Task>
。 - canton7