2013-12-16 193 views
1

我想通過使用BackgroundWorker來執行在我的UI內部更新進度條的簡單操作。我不知道我做錯了什麼。任何幫助是極大的讚賞。從ViewModel更新UI線程

private void ProcessButtonClickAction(object param) 
{ 
    BackgroundWorker BGWUpdateUi = new BackgroundWorker(); 

    BGWUpdateUi.ProgressChanged += (sender, args) => 
    { 
     ProgressBarValue += args.ProgressPercentage; 
     ((SelectedDwgFile)args.UserState).Status = "Completed"; 
    }; 

    BGWUpdateUi.WorkerReportsProgress = true; 

    foreach(var obj in FileList) 
    { 
     Thread.Sleep(250); 
     BGWUpdateUi.ReportProgress(pbvalueIncrement, obj); 
    } 
} 

集合是一個ObservableCollectionProgressBarValue綁定到進度條的值。

我看了幾個例子,無論我嘗試哪一個 - BackgroundWorkerDispatcher - 它們都在循環之後更新。

回答

3

將要在後臺運行的一部分,進入DoWork方法,然後調用RunWorkerAsync

private void ProcessButtonClickAction(object param) 
{ 
    BackgroundWorker BGWUpdateUi = new BackgroundWorker() 

    BGWUpdateUi.DoWork += (sender, args) => 
    { 
     foreach (var obj in FileList) 
     { 
      Thread.Sleep(250); 
      obj.Status = "Completed"; 
      ProgressBarValue += pbvalueIncrement; 
     } 
    }; 
    BGWUpdateUi.RunWorkerAsync(); 
} 

此外,確保派遣UI相關的更新回到UI線程(否則你會得到一個跨線程訪問異常)。

+0

我想我不理解。我想要在一個循環中,當我執行一些邏輯之後,我想更新UI。我是否必須執行DoWork事件中的邏輯? –

+0

@TraeMoore是的,你必須把它放在'DoWork'中,否則它會同步執行,直到方法結束纔會更新UI。 – McGarnagle

+0

對不起,我一定會讓你發瘋。 :)我正在從一個ICommand執行此操作,所以我無法訪問應用程序。我的ViewModel與我的觀點完全分離。和FileList綁定到一個'DataGrid',所以我不能推它'ToArray()'。 –