[英]WPF mvvm backgroundworker UI displaying different results
所以最后我設法創建了一個工作的BackgroundWorker。
我使用ReportProgress方法以這種方式更新了UI元素:
bw.ReportProgress(1, node);
bw.ReportProgress(2, connection);
bw.ReportProgress(3);
bw.ReportProgress(4, system);
如果連接是模型對象,這是我的進度方法:
void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
if (e.ProgressPercentage == 1) //update nodes
{
this.Network.Nodes.Add((NodeViewModel)e.UserState);
}
if (e.ProgressPercentage == 2) //update connections
{
this.Network.Connections.Add((ConnectionViewModel)e.UserState);
}
if (e.ProgressPercentage == 3)
{
this.Network.Connections.Clear();
this.Network.Nodes.Clear();
}
if (e.ProgressPercentage == 4)
{
MainNet.Systems.Add((Common.Model.System)e.UserState);
}
}
我有多個對象要更新,因此我將百分比用作過濾器。
每次我運行代碼時,都會得到不同的結果,好像某些數據未在UI中正確呈現
UI的正確形式:
不正確:
如果您需要同步工作人員以避免重入或競賽,則有幾種不同的方法。 您可以嘗試這樣的方法...
private static void ManageBackgroundWorkers()
{
BackgroundWorker backgroundWorker1 = new BackgroundWorker();
BackgroundWorker backgroundWorker2 = new BackgroundWorker();
BackgroundWorker backgroundWorker3 = new BackgroundWorker();
backgroundWorker1.DoWork += (s, a) =>
{
/* do stuff*/
};
backgroundWorker2.DoWork += (s, a) =>
{
/* do some more stuff*/
};
backgroundWorker3.DoWork += (s, a) =>
{
/* do even more different stuff*/
};
backgroundWorker1.RunWorkerCompleted += (s, a) =>
{
//this.Network.Nodes.Add((NodeViewModel)e.UserState);
backgroundWorker2.RunWorkerAsync();
};
backgroundWorker2.RunWorkerCompleted += (s, a) =>
{
//this.Network.Connections.Add((ConnectionViewModel)e.UserState);
backgroundWorker3.RunWorkerAsync()
};
backgroundWorker3.RunWorkerCompleted += (s, a) =>
{
// finish remaining tasks here
};
/* start the queue */
backgroundWorker1.RunWorkerAsync();
}
每個工作程序都發出完成信號,並且其事件處理程序僅啟動該系列中的下一個工作程序。 這與您擁有的內容沒有太大的區別,但是它重新打包了您使用“ Percentage”屬性的步驟。 無論如何,百分比確實是國家的不良代表。 重構代碼大約需要5分鍾。
另一種方法是使用一個ManualResetEvent來檢測回調,該回調在每次調用時發出信號。 每次調用ReportProgress處理程序后,都會在工作線程中等待ManualResetEven。 混亂,模塊化程度較低,但確實可行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.