亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

異步.NET控制臺程序中的線程控制流

異步.NET控制臺程序中的線程控制流

C#
慕仙森 2022-12-31 10:35:19
我在 C# 中弄亂了 async/await 只是為了深入研究一些線程控制流并偶然發現了一個不尋常的行為,我真的很感謝澄清。即使 Task 本身在后臺執行,await 之后的執行也會在調用線程上繼續執行,這是有道理的。事實上,這正是發生在 WPF 中的情況。以下代碼:private async void Button_Click(object sender, RoutedEventArgs e){    Console.WriteLine($"Start. Thread: {Thread.CurrentThread.ManagedThreadId}");    await Task.Run(async () => await Task.Delay(1000));    Console.WriteLine($"End. Thread: {Thread.CurrentThread.ManagedThreadId}");}結果:開始。線程:1結束。線程:1我意識到這是使程序流可預測等的方法。但令我驚訝的是 .NET 控制臺應用程序的異步 Main 方法功能顯示出有些不同的行為。相同的代碼:static async Task Main(string[] args){    Console.WriteLine($"Start. Thread: {Thread.CurrentThread.ManagedThreadId}");    await Task.Run(async () => await Task.Delay(1000));    Console.WriteLine($"End. Thread: {Thread.CurrentThread.ManagedThreadId}");}導致不同的線程控制流程:啟動。線程:1結束。線程:5我的猜測是,控制臺應用程序具有不同的同步上下文概念,并且不像 WPF 那樣綁定到主“UI”線程。但我實際上正在努力尋找一些明確的信息。
查看完整描述

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.

    ...

    圖 4SynchronizationContext實施摘要
    ...

╔═════════╦═══════════╦════════════╦════════════╦══════════╦══════════╗

║         ║ 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    ║

╚═════════╩═══════════╩════════════╩════════════╩══════════╩══════════╝


查看完整回答
反對 回復 2022-12-31
  • 1 回答
  • 0 關注
  • 91 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號