2011-05-20 74 views
0

如果我有做這樣的事情後臺工作,如何構建命令

if (ab) 
    { 
     //dostuff 
    } 
    else if (b) 
    { 
     //dostuff 
    } 
    else if (c) 
    { 
     //do stuff. 
    } 

而且每次關閉當前打開的形式,並重新顯示不同數據的新形式的方法。我怎樣才能包裝每個窗體顯示加載欄只是爲了讓用戶不需要加載。

我無法在新線程中打開加載表單,因爲進度條並沒有進展,而且看起來很傻,沒有3個不同的後臺工作人員在做同樣的工作方法。

感謝

回答

0

您可以輕鬆地將數據傳遞到BackgroundWorker

BackgroundWorker bw = new BackgroundWorker(); 
bw.WorkerSupportsCancellation = true; 
bw.WorkerReportsProgress = true; 

if (ab) 
{ 
    //dostuff 
    bw.RunWorkerAsync("ab"); // Run 
} 
else if (b) 
{ 
    //dostuff 
    bw.RunWorkerAsync("b"); // Run 
} 
else if (c) 
{ 
    //do stuff. 
    bw.RunWorkerAsync("c"); // Run 
} 

,然後有:

private void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    string from = sender as string; 

    switch case (string) 
    { 
     case "ab" : 
        // process 
        break; 
     case "b" : 
        // process 
        break; 
     case "c" : 
        // process 
        break; 
    } 
} 

private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    // Add here your progress output 
} 

private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    // Add here your completed output 
} 
0

處理好ProgressChanged event更新進度條?這將在UI線程上運行回調。

由於BackgroundWorker通過DoWork event運行任務,因此可以在所有情況下(或任意方法)連線到相同的方法。如果使用閉包(讀取:lambdas/anon函數),正確的綁定可以簡單地保持不變。

BackgroundWorker bw = new BackgroundWorker(); 
// ... other setup such as a unified ProgressChanged 

if (ab) { 
    var greeting = "Hello"; 
    var name = "Fred"; 
    bw.DoWork += (sender, args) => { 
     // this can be entirely unique or funnel to something unified. 
     CallSomeSharedMethods(); 
     // use some bound variables (carefully) 
     // closures are nifty, but watch mutations and lifetimes 
     // (I find this generally easier than dealing with the DoWorkArgs data) 
     Console.WriteLine(greeting + " " + name + "!"); 
     // update some progress 
     bw.ReportProgress(100); 
    }; 
} else { 
    // likewise for others re-using as much 
    // (or little) as required 
} 

快樂編碼。

0

由於balexandre已經注意到您可以將數據傳遞給Worker。但這些數據也可以通過Action或Func。所以你可以傳入任何應該在後臺工作者執行的方法。一個例子可以在this answer中找到。

但請注意,如果您嘗試在後臺工作任務中設置gui元素的任何屬性,可能會遇到跨線程異常。要做到這一點BeginInvoke是你的朋友,也可以封裝在extension method