簡體   English   中英

Task.Yield(); SyncAction(); vs Task.Run(()=> SyncAction());

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM