.NET(C#): 在非UI線程中使用await

來源:互聯網
上載者:User

主題是“在非UI線程中使用await”,不過如果讀者真想這麼做,我想先反問下讀者,為什麼你要在非UI線程中使用await?畢竟,需要執行的任務已經執行在一個Task中了,此時你只需要在UI線程中使用await來非同步等待執行Task線程,await會根據當前SynchronizationContext環境來執行後續代碼。這一切都是合情合理的。因此如果你的代碼中有在非UI線程中使用await,並且await後的代碼需要訪問UI的情況,考慮修正你的代碼。

 

當然探索技術的一大樂趣就是去考慮一些非通常情況,那麼如果我們非要在非UI線程中使用await,怎樣讓await生效:

方法一:await會捕獲當前SynchronizationContext,因此手動設定SynchronizationContext,然後再用await:

//設定SynchronizationContext,以WPF為例

System.Threading.SynchronizationContext.SetSynchronizationContext(

    new System.Windows.Threading.DispatcherSynchronizationContext(App.Current.Dispatcher));

//await(Task.Run是類比執行的多線程操作)

await Task.Run(() => Task.Delay(1000));

//await後安全訪問UI

 

方法二:設定SynchronizationContext,然後用針對SynchronizationContext的TaskScheduler來執行await後代碼:

//設定SynchronizationContext,以WPF為例

System.Threading.SynchronizationContext.SetSynchronizationContext(

    new System.Windows.Threading.DispatcherSynchronizationContext(App.Current.Dispatcher));

 

//Task.Run是類比執行的多線程操作

Task.Run(() => Task.Delay(1000))

    .ContinueWith((task) =>

    {

        //await後安全訪問UI

    },

    //使用TaskScheduler.FromCurrentSynchronizationContext方法來返

    //回針對當前SynchronizationContext的TaskScheduler

    TaskScheduler.FromCurrentSynchronizationContext());

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.