簡體   English   中英

Async/Await 和 Dispatcher 的區別

[英]Difference between Async/Await and Dispatcher

我正在開發一個 WPF 應用程序,但遇到了凍結問題,現在我了解到它是一個單線程應用程序,但我對術語感到困惑

我簡單的術語

Async/Await 和 Dispatcher 的區別

我想解釋一下我的觀點,這樣就清楚我的誤解,直到現在我才知道大多數應用程序都是 STA(在 c# 中),你必須使用異步編程,這很可能涉及

  • 通過優先處理已經完成的工作,然后使用工作線程通知 UI 線程繁重的工作已完成,將工作轉移到 UI 線程上的單個線程
  • 也是一個真正的多線程應用程序,其中需要創建一個線程來完成其上的任務

我認為在大多數情況下,我的概念至少是可靠的,至少可以說我缺乏的是應用這些能力

例如,我雖然以前為了啟用異步編程,我們不得不使用從主方法調用的委托,這演變成委托的調度員切割,進一步演變成異步並等待切割“任何單一使用的”調度員(甚至那個文字關鍵詞)

所以我在函數聲明中使用的只是“async”詞,然后是“task”,然后通過粘貼“await”詞等待一些緊張的過程,然后它最終用 Task.Run(() = 封裝緊張的工作> IntenseWork())

但現在我很困惑你必須使用 Dispatcher 這個詞,因為 UI 元素只能由 dispatcher 訪問,並且使用 Dispatcher.Invoke(IntenseWork()),然后有 Dispatcher.Begininvoke 和 Dispatcher.AsyncIncoke

懷疑:

在這種情況下 async/await 和 task.run 是不夠的,甚至在這里使用任務並行庫


我提出問題並研究並堅持這些結論,這些是我以前的問題

異步導航

在示例問題中使用 async 和 await 實現異步

您正在詢問來自不同時期的兩種不同技術。

常見的問題是 UI 是單線程的,只能從主 (UI) 線程訪問。

您可以並且應該盡可能地將非 UI 工作卸載到另一個線程。 但是通常有結果需要在之后顯示。

舊的(但仍然有效)方法是將委托交給 WinForms 中的 Dispatcher.Invoke() 或 Control.Invoke()。

適用於 Task.Run() 和所有 DoSomethingAsync() I/O 方法的較新方法是使用 await:

// use async void only for eventhandlers
async void LoadButton_Click(object s, RouteEventArgs e)
{
   // get input from controls here
   var results = await Task.Run(() => HeavyWorkWithoutUI());
   // update UI with results here
}

WPPF 和 WinForms 支持是您的頂級方法將在等待之前和之后在 UI 線程上運行。 重方法將在另一個線程上運行。 在等待期間,您的 UI 保持響應。

所以 await 更方便一點,讓你用更少的努力編寫更易讀的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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