2014-05-08 28 views
0

所以最後我設法創建了一個工作的BackgroundWorker。WPF mvvm backgroundworker UI顯示不同的結果

我使用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的正確形式呈現:

This is the correct form of UI

不糾正:

This is not correct

+0

你能否提供更多關於如何調用ReportProgress()的細節? – Slugart

+0

這是一個競賽條件嗎? –

+0

@GarryVass什麼是比賽條件? Slugart - 它在上面的主要信息,這是所有'ReportProgress'調用,我也有其他電話,現在不適合添加它們 – Yogevnn

回答

1

如果你需要你的工人(S)同步,以避免或重入一場比賽,有幾種不同的方式。你可以嘗試這樣的做法...

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(); 
    } 

每個工人信號完成其事件處理程序簡單地開始下一個工作人員在系列。這不是你所擁有的巨大差異,而是重新包裝你使用「百分比」屬性的步驟。無論如何,百分比實際上是一個糟糕的州代理。重構你的代碼應該需要大約5分鐘。

另一種方法是使用ManualResetEvent對回調進行檢測,每次調用時都會發出一個信號。每次調用ReportProgress處理程序後,ManualResetEven都會在worker中等待。梅西耶,較少模塊化,但確實可行。

+0

不幸的是,這並不能幫助我的情況,我不能修改主要方法,所以它會被破壞到很多部分,有沒有其他方法? – Yogevnn

+0

如果你的學士學位要求你在「主要方法」中做所有事情(不包括在你的問題陳述中),那麼考慮換個不同的大學。 –

+0

不不哈哈,不用擔心(我的程序中有124個課程和窗口..)但我所說的功能不能被破壞 – Yogevnn