2013-04-05 26 views
3

我有一個Gui應用程序將執行不同的驗證。由於部分驗證的可能需要更長的時間,我在一個BackgroundWorker運行它們,當前的代碼如下所示:有多個DoWorkEventHandlers是不好的做法嗎?

//sample validator interface 
public interface Validator 
{ 
    void Validate(); 
} 

//BGWs DoWork-method: 

private void myBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    ValidatorA.Validate(); 
    ValidatorB.Validate(); 
    ValidatorC.Validate(); 
} 

現在也有一些驗證器必須支持取消爲好。這可以通過添加一堆的代碼來實現或者我可以這樣來做:

public interface Validator 
{ 
    void DoValidationWork(object sender, DoWorkEventArgs e); 
} 

class NormalValidator 
{ 
    void DoValidationWork(object sender, DoWorkEventArgs e) 
    { 
     //validation-work 
    } 
} 

class CancelableValidator 
{ 
    void DoValidationWork(object sender, DoWorkEventArgs e) 
    { 
     BackgroundWorker bgw = sender as BackgroundWorker; 
     while(!bgw.CancellationPending) 
     { 
      //validation-work 
     } 
    } 
} 

//setup 
myBGW.DoWork += ValidatorA.DoValidationWork; 
myBGW.DoWork += CancelableValidatorB.DoValidationWork; 
myBGW.DoWork += ValidatorC.DoValidationWork; 

這將根據我的理解產生相同的結果,但每一個驗證器可以自行處理取消。

可以有多個DoWork-Handlers嗎?或者這是不好的做法嗎?

+0

我不知道,但我真的不相信它會使代碼更簡單。在等待更好的答案時,您可以對您的項目運行代碼分析(使用一些非常嚴格的規則,例如「Microsoft Extended Design Guideline Rules」),並查看微軟員工對此的看法。 – 2013-04-05 10:34:56

回答

2

您可能會發現使用大多數內聯匿名函數更爲清潔。例如:

BackgroundWorker worker = new BackgroundWorker(); 
worker.DoWork += (s, dwe) => 
{ 
    dwe.result = ... 
    // do work here 
}; 
worker.RunWorkerCompleted += (s, rwe) => 
{ 
    if (rwe.Error != null) { 
     // show dialog/message 
    } else { 
     var something = rwe.Result; 
    } 
}; 
worker.RunWorkerAsync(); 
相關問題