2017-03-04 207 views
2

同步運行異步方法的首選方式是什麼?異步傳播異步運行異步任務

這是我目前做的:

void RunSync() { 
    var task = Task.Run(() => RunAsync()); 
    task.Wait(); 
} 

async Task RunAsync() { 
    throw Exception("test"); 
} 

我與上面的代碼的問題是,task.Wait()拋出AggregateException而不是由RunAsync這就是我寧願拋出的實際的異常。

有沒有辦法從RunAsync傳播實際的異常而不訴諸AggregateException並解開?

回答

3

快速回答:

更改此:

var task = Task.Run(() => RunAsync()); 
task.Wait(); 

這樣:

var task = RunAsync(); 
task.Wait(); 

你不應該換異步方法與Task.Run運行它。 閱讀SO答案'如何從同步上下文中調用異步方法',例如How would I run an async Task<T> method synchronously?

+0

涼爽。非常感謝! – CoderBrien

+0

從你的鏈接 - 是所有的調度/消息泵相關的東西在Windows /窗體應用程序中運行?如果我正在運行控制檯應用程序,我應該罰款嗎? – CoderBrien

+0

在不同的環境(WinForms,控制檯應用程序,IIS)中有一些細微差別,但對你而言並不重要。 – mukh1n

0

爲了解開了AggregateException,這樣做:

RunAsync().GetAwaiter().GetResult();