如何正确地重新抛出已经处于故障状态的任务的exception?

我有一个同步方法,除其他外,它检查待处理任务的状态并重新抛出其exception,如果有的话:

void Test(Task task) { // ... if (task.IsFaulted) throw task.Exception; // ... } 

这不会传播exception堆栈跟踪信息,并且对调试器不友好。

现在,如果Testasync ,它将不会像这样简单和自然:

 async Task Test(Task task) { // ... if (task.IsFaulted) await task; // rethrow immediately and correctly // ... } 

问题:如何正确执行同步方法? 我想出了这个,但我不喜欢它:

 void Test(Task task) { // ... if (task.IsFaulted) new Action(async () => await task)(); // ... } 

要正确地重新抛出exception,您应该使用ExceptionDispatchInfo

 ExceptionDispatchInfo.Capture(task.Exception.InnerException).Throw(); 

可以这样做:

 task.GetAwaiter().GetResult(); 

PS您的Action方法无法正常工作,因为您正在创建async void方法,并且无法捕获从该方法传播的exception。