繁体   English   中英

WPF mvvm backgroundworker UI显示不同的结果

[英]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的正确形式:

这是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM