2017-09-20 60 views
-1

忽略異步/伺機解決方案是有這些2臺代碼之間的任何差異?在這種情況下你真的需要Task.WaitAll嗎?忽略它會有什麼負面影響嗎?Task.WaitAll vs序列化的task.results?

public void ExampleA() 
{ 
    Task<object> fooTask = _someFactory.StartFooTask(); 
    Task<object> barTask = _someFactory.StartBarTask(); 

    //misc code ... 

    _fooResult = fooTask.Result; 
    _barResult = barTask.Result; 

    //more misc code ... 
} 

public void ExampleB() 
{ 
    Task<object> fooTask = _someFactory.StartFooTask(); 
    Task<object> barTask = _someFactory.StartBarTask(); 

    //misc code ... 

    Task.WaitAll(fooTask, barTask); 

    _fooResult = fooTask.Result; 
    _barResult = barTask.Result; 

    //more misc code ... 
} 

照例a就更有道理了我,尤其是在情況下,其中可能有一些更多的單位計算各種可能會出現一個任務結果可能需要更快然後其他人呢?如果碰巧需要的話,實際上會更早完成。

public void ExampleC() 
{ 
    Task<object> fooTask = _someFactory.StartFooTask(); 
    Task<object> barTask = _someFactory.StartBarTask(); 

    //misc code ... 

    _fooResult = fooTask.Result; 

    // more misc code requiring _fooResult ... 

    _barResult = barTask.Result; 

    // more misc code requiring _barResult... 
} 
+1

一個問題我用'WaitAll'是,如果有任何的任務異常就會拋出'AggregateException'看到。而在'ExampleA'中,你會知道哪個任務拋出了異常,並且可以有機制來分別處理它們。 –

回答

1

如果你想保證這兩個(全部)方法完成後,您會使用WaitAll,否則第一個任務異常會阻止呼叫.Result或第二任務,因此第二種方法可能不是由時間方法退出完成。

整體行爲將非常接近

  • 存在時拋出異常小的差異(.WhenAll與個人.Result
  • 如你poined出你能適應.Result電話,如果之間的一些代碼你沒有WaitAll
  • 兩個版本將在ASP.Net/Winforms/WPF環境死鎖。
+0

我正在使用控制檯應用程序。所以不擔心造成上述情況的僵局。 – WillFM

0

從邏輯上講,這兩種方法將阻塞,直到fooTaskbarTask已經完成。

當然也有發生差異。您正在初始化並拆除不同的同步原語,但沒有任何您會注意到的。

在第3段,將出現您所描述的行爲。但是,如果要同時處理結果,則應使用延續(Task.ContinueWith等)。

如果不傳遞經典建議,我無法解決此代碼 - 如果可以避免,請不要致電Task.Wait或使用Task<T>.Result進行阻止。你的同事會恨你。