[英]What's the difference between Task.Yield, Task.Run, and ConfigureAwait(false)?
[英]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上。
雖然兩個選項都很糟糕,但存在差異(在GUI應用程序中很重要):在Task.Yield
返回后,方法的其余部分將被調度回原始的SynchronizationContext
。 如果你從UI線程運行它,你的長時間運行操作將在UI線程上執行,從而凍結它。 因此,如果您的目的是避免UI阻塞 - Task.Yield
將無法正常工作。 使用Task.Run
不會發生。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.