1 回答

TA貢獻1829條經驗 獲得超7個贊
簡而言之,當SynchronizationContext.Current
未設置時,(控制臺應用程序就是這種情況)。在 上調用 await 響應ThreadPool
。
controlToSendTo.BeginInvoke();
在 Winforms/WPF 上,實現了 SynchronizationContext 以將對 winforms或 WPF的響應排隊Dispatcher.BeginInvoke();
。
參考:
Await、SynchronizationContext 和控制臺應用程序(開發團隊成員的博客文章):
但是有一種常見的應用程序沒有
SynchronizationContext
:控制臺應用程序。當您的控制臺應用程序的Main
方法被調用時,SynchronizationContext.Current
將返回null
. 這意味著如果您在控制臺應用程序中調用一個異步方法,除非您做一些特殊的事情,否則您的異步方法將沒有線程親和力:這些異步方法中的延續最終可能會“在任何地方”運行。Parallel Computing - It's All About the SynchronizationContext(這篇文章引用自該類的官方文檔
SynchronizationContext
):默認情況下,控制臺應用程序和 Windows 服務中的所有線程都只有默認的
SynchronizationContext
....
圖 4
SynchronizationContext
實施摘要
...
╔═════════╦═══════════╦════════════╦════════════╦══════════╦══════════╗
║ ║ Specific ║ Exclusive ║ Ordered ║ Send May ║ Post May ║
║ ║ Thread ║ (Delegates ║ (Delegates ║ Invoke ║ Invoke ║
║ ║ Used to ║ Execute ║ Execute ║ Delegate ║ Delegate ║
║ ║ Execute ║ One at ║ in Queue ║ Directly ║ Directly ║
║ ║ Delegates ║ a Time) ║ Order) ║ ║ ║
╠═════════╬═══════════╬════════════╬════════════╬══════════╬══════════╣
║ ... ║ ║ ║ ║ ║ ║
╠═════════╬═══════════╬════════════╬════════════╬══════════╬══════════╣
║ Default ║ No ║ No ║ No ║ Always ║ Never ║
╚═════════╩═══════════╩════════════╩════════════╩══════════╩══════════╝
- 1 回答
- 0 關注
- 91 瀏覽
添加回答
舉報