[英]What are Context class SychronizationContext class in C#?
我是 C# 多線程的新手,我正在學習一些關於多線程、異步編程和並行編程的教程,其中我遇到了某些術語,例如“上下文”、“上下文切換”和“延續到原始上下文”。 在查看 .NET 文檔后,我在 System.Threading 命名空間中發現了一些類似的類和屬性,例如返回 Context 類型數據的“CurrentContext”,並且在 System.Threading 命名空間中有“SynchronizationContext”class。
誰能解釋一下這個術語,屬性和類? 我覺得很難掌握。
謝謝你。
SynchronizationContext
是較舊的 API,旨在允許多個線程相互協調。 特別是,這在歷史上來自諸如 winforms 之類的 UI 世界,其中有一個主 UI 線程,如果您有后台工作正在進行,它可能需要返回到 UI 線程以執行諸如 UI 更新之類的操作。 有多種機制可以做到這一點, SynchronizationContext
就是其中之一。 本質上,這公開了兩個 API: Post
和Send
(主要區別在於Send
阻塞等待工作完成)。
現在,與此完全分開, async
/ await
是一個不同的 API model 用於執行異步代碼,即
var foo = await BarAsync();`
SomethingElse(foo);
這里,如果BarAsync
同步完成,代碼只是保持正常運行, SomethingElse
會立即執行; 但是,如果BarAsync
返回不完整(即異步),則線程展開,將控制權返回到它來自的任何地方,並且當BarAsync BarAsync
結果可用時,將運行SomethingElse
的延續。
這兩個模型相交的地方是await
背后的實現知道SynchronizationContext
的存在,如果存在,它將(默認情況下)捕獲當時存在的同步上下文,並通過該同步上下文恢復執行( Post
),基於您可能希望回到線程 model,而不是在觸發BarAsync
完成的任何線程 model 上。 可以使用ConfigureAwait
配置(禁用)此行為:
var foo = await BarAsync().ConfigureAwait(false);`
SomethingElse(foo);
現在它不會捕獲同步上下文,並且當不完整的操作恢復時不會調用額外的間接。 這對於避免額外的上下文切換很有用,但意味着某些事情(例如更新 UI)可能會失敗。 通常(但不是普遍),應用程序代碼很少使用ConfigureAwait
,而庫通常使用ConfigureAwait
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.