2013-04-05 60 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(); 
相关问题