2016-09-12 50 views
4

比方說,我想只是迅速做出異步以下方法運行:Task.Yield(); SyncAction(); vs Task.Run(()=> SyncAction());

ResultType SynchronousCode(ParamType x) 
{ 
    return SomeLongRunningWebRequest(x); 
} 

什麼是如何以下兩個代碼示例執行/計劃的區別?

async Task<ResultType> AsynchronousCode(ParamType x) 
{ 
    return await Task.Run(() => SomeLongRunningWebRequest(x)); 
} 

相比:

async Task<ResultType> AsynchronousCode(ParamType x) 
{ 
    await Task.Yield(); 
    return SomeLongRunningWebRequest(x); 
} 

據我所知,Task.Yield()調用將確保線程立即返回給調用者,而Task.Run()肯定會安排代碼在ThreadPool的某個地方運行,但是這兩種方法都有效地使該方法異步?讓我們假設這個問題,我們在默認的SynchronizationContext上。

回答

6

雖然這兩個選項都不好,但有一個區別(在GUI應用程序中很重要):在Task.Yield返回後,該方法的其餘部分將分派回原始SynchronizationContext。如果你從UI線程運行它,你的長時間運行的操作將在UI線程上執行,從而凍結它。所以如果你的意圖是爲了避免UI阻塞 - Task.Yield將無法​​正常工作。與Task.Run不會發生。

+0

所以,如果我們在默認的SynchronizationContext上,那麼根本沒有區別? – Dev2345

+0

@ Dev2345只要你沒有一個時髦的任務調度器覆蓋默認調度程序....,是的,我認爲... –

+3

我想在默認情況下,它沒有區別。但我很難想象你會這樣做,除了UI應用程序(以避免阻塞) – Evk