簡體   English   中英

C# 中的上下文 class 同步上下文 class 是什么?

[英]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: PostSend (主要區別在於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.

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