我在控制檯應用程序(不確定這是否與它有關)和使用任務時遇到了一個奇怪的問題。Threading.Tasks:WaitAll的概念()
大多數例子顯示故意調用一個例外測試/解釋爲WaitAll的概念 - 但對我來說,這似乎我在做某種根本性錯誤(或不完全明白)。
Task<int> task1 = Task<int>.Factory.StartNew(()=> foo(arg));
Task<int> task2 = Task<int>.Factory.StartNew(()=> bar(arg));
Task<int>[] tasks = {task1, task2};
try
{
Task.WaitAll(tasks); //hits this far
if((int)task1.Result * (int)task2.Result == 99) //this seems to never get hit
{
System.Environment.Exit(0); //so this isn't called
}
else
{
System.Environment.Exit(1); // neither is this called
}
}
catch
{
.....
在它上面似乎if
塊是打不到那麼返回既不退出代碼 - 因此控制檯應用程序掛起。
也不會拋出異常 - 我可以證實這一點,因爲全部任務實際上已完成 - 我只是沒有包括上面的catch
部分以簡潔起見。
這些任務很快完成 - 它們沒有掛起,所以它不像Task.WaitAll仍然在等待 - 或者它可能是這樣,這就是我錯過的東西(它在等什麼)?
任何想法,建議或殘酷的更正?謝謝!
我們需要更多地瞭解這些任務。您對WaitAll的理解是正確的,它會在任務完成時返回,或者在任何任務中拋出異常時拋出異常。 (請注意,只有在完成所有任務後纔會拋出異常) – caesay
片段確實需要證明foo或bar引發異常。否則你應該沒有問題用調試器診斷,它會清楚地顯示你的catch塊受到打擊。 –
作爲一個方面說明,你不需要'(int)'強制轉換,Result中的類型已經是'(int)'了。 – svick