有多个DoWorkEventHandlers是一种不好的做法吗?

3

我有一个GUI应用程序,需要执行不同的验证操作。由于某些验证可能需要较长时间,所以我将它们在BackgroundWorker中运行,当前代码如下:

//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处理程序或者这是不好的做法?

我不知道,但我并不真的相信这会使代码更简单。在等待更好的答案时,您可以对项目运行代码分析(使用一些相当严格的规则,如“Microsoft扩展设计指南规则”),看看微软的人对此有何看法。 - Sacha K
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接