[英]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.