2014-09-30 38 views
0

讓我們說,我有這樣一個電話:等待與Task.Run(NonAsyncMethod())更好嗎?

await Task.Run(async() => SomeLongRunningNonAsyncMethod()); 

我的理解是,當SomeLongRunningNonAsyncMethod()被調用,調用不返回,直到遇到等待。但SomeLongRunningNonAsyncMethod()中沒有等待。

那麼,這是否與直接SomeLongRunningNonAsyncMethod()調用相同?

+0

沒有它不是..如果我的理解問題的權利..能否請您闡述一下你在找什麼? – 2014-09-30 07:40:25

+0

你的標題可能需要改進。 「比什麼更好」? – Default 2014-09-30 07:41:54

回答

2

你的理解確實是有缺陷的。

由於代碼執行到達await Task.Run,它將像往常一樣首先執行Task.Run(這將在線程池中對該方法進行排隊),然後立即返回。當Task.Run內部的方法結束時,執行將在await之後繼續。

這是否有用很大程度上取決於您的上下文。例如,如果您是通過WinForms/WPF應用程序中的事件處理程序調用此方法的,這確實是避免在執行一些後臺工作時阻塞UI線程的好方法。如果你在web應用程序中這樣做,你只是無緣無故地導致線程切換和線程池線程。

如果你在做Task.Run的I/O操作,而不是CPU工作,你希望找到一個異步API來完成相同的I/O工作 - 這將爲你節省不管怎樣都會阻止I/O請求完成。

0

await關鍵字會在返回到Task.Run的呼叫後立即返回調用方法。該調用返回「立即」(它只會調度使用當前任務調度程序的操作,而不是等待它完成)。任務完成後,await行後面的代碼將繼續執行。

3

我的理解是當SomeLongRunningNonAsyncMethod()被調用時,調用不會返回,直到遇到等待。但在SomeLongRunningNonAsyncMethod()沒有等待。

您需要delegate區分你傳遞給Task.RunTask.Run

實際執行前者將同步執行ThreadPool線程內。您不需要使用async關鍵字,因爲您並未等待給定委託內的任何異步操作。

Task.Run開始執行時,後者將命中它的await並將控制權退回到調用方法,直到委託完成執行。

那麼,這是直接SomeLongRunningNonAsyncMethod()調用相同嗎?

否。直接呼叫將在當前運行線程上同步執行。您的代碼在ThreadPool線程上同步執行委託,同時調用Task.Run的線程等待完成Task,非阻塞時尚。

您的代碼實際上應該是:

await Task.Run(SomeLongRunningNonAsyncMethod); 
相關問題