Dot-Net

WPF MVVM中啟動執行緒查找任務的正確方法

  • December 9, 2014

所以我有一個任務可以由我的 GUI 執行,它將提取資訊以使用 SQL 數據庫查詢響應填充 ViewModel。 假設我想開始這個任務並讓我的 gui 自由地繼續其他事情,同時播放“搜尋”動畫,在 WPF/MVVM 中執行此操作的正確方法是什麼? 我假設您需要啟動一個非同步程序並設置一個與啟動動畫情節提要的數據觸發器相關的布爾值。**但是我用什麼來啟動這個過程?線?**我還是 WPF 的新手,只是想確保我使用的是正確的類。

我使用 BackgroundProcess 執行緒來做這樣的事情。

這是 MSDN 的連結:http: //msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

與此相關的其他詳細資訊。

您有三個與 BackgroundProcess 對象關聯的事件:DoWork、ReportProgress 和 WorkCompleted。

現在,要使用它——並將它與 observablecollection 一起使用——你需要告訴 BackgroundProcess 對象能夠報告進度(這是一個我總是顯式設置的布爾屬性,以及允許取消)。

現在要啟動一個程序,您將呼叫 RunWorkerAsync 方法。此方法能夠接受 OBJECT 變數,以防您需要向其傳遞數據(如果您想要超過 1 個值,請創建一個要傳遞到 RunWorkerAsync 的結構)。

RunWorkerAsync 觸發 DoWork 事件,因此控制權轉到您的 DoWork 事件處理程序。這是我使用它的(經過清理的)程式碼:

Dim dt As System.Data.DataTable
dt = da.GetDataTable(sql, System.Data.CommandType.Text, params)
For Each row As System.Data.DataRow In dt.Rows
  If loadQuestionsWorker.CancellationPending Then
      e.Cancel = True
      Exit Sub
  End If
  Dim item As New DataObject
  // Assign Item Values
  backgroundProcessObject.ReportProgress(1, item)
Next

這裡發生的事情是,我從我的數據層獲取了一個數據表,然後當這個後台程序沒有被取消時,我正在遍歷數據表,當我建構一個新的 DataObject 時,我報告該對象正在建構.

現在,在我的 ProgressChanged 事件處理程序(ReportProgress 方法引發 ProgressChanged 事件)中,控制項又回到了 UI 執行緒的手中,因此我可以做一些事情,比如影響 UI 並將我正在報告的元素添加到 ObservableCollection。

最後,在我的 WorkedCompleted 事件處理程序中(當 DoWork 事件處理程序方法執行完成時會引發相應的事件)我檢查我的進度是否被取消(這有時意味著我想轉儲 ObservableCollection),我可能會也可能不會影響 UI(例如刪除“搜尋”動畫。

引用自:https://stackoverflow.com/questions/1294869