簡體   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