我用一組任務的時間,爲了確保他們都期待我用這個辦法:爲什麼這個異常不會被拋出?
public async Task ReleaseAsync(params Task[] TaskArray)
{
var tasks = new HashSet<Task>(TaskArray);
while (tasks.Any()) tasks.Remove(await Task.WhenAny(tasks));
}
,然後調用它像這樣:
await ReleaseAsync(task1, task2, task3);
//or
await ReleaseAsync(tasks.ToArray());
然而,最近我一直注意到一些奇怪的行爲,並設置了ReleaseAsync方法是否有問題。我設法縮小到這個簡單的演示,它包含System.Threading.Tasks
,它運行在linqpad。它也將在控制檯應用程序或asp.net mvc控制器中稍作修改。
async void Main()
{
Task[] TaskArray = new Task[]{run()};
var tasks = new HashSet<Task>(TaskArray);
while (tasks.Any<Task>()) tasks.Remove(await Task.WhenAny(tasks));
}
public async Task<int> run()
{
return await Task.Run(() => {
Console.WriteLine("started");
throw new Exception("broke");
Console.WriteLine("complete");
return 5;
});
}
我不明白的是爲什麼Exception從不出現在任何地方。我會認爲,如果有例外的任務等待,它會拋出。我可以用一個簡單的爲每個這樣的更換while循環,以確認這一點:
foreach(var task in TaskArray)
{
await task;//this will throw the exception properly
}
我的問題是,爲什麼不所示的例子拋出異常正確(它從來沒有在任何地方顯示出來)。
的可能重複(http://stackoverflow.com/questions/22856052/how- to-handle-task-factory-startnew-exception) –
任何不使用Task.WhenAll的理由? –
@PauloMorgado - 是的,這些被綁定到託管資源,我想在釋放他們時,而不是等待他們完成,然後釋放。 –