拥有多个DoWorkEventHandler是不好的做法吗?

时间:2013-04-05 10:21:24

标签: c# backgroundworker

我有一个Gui-Application,它将执行不同的验证。由于其中一些验证可能需要更长时间,因此我在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-Handler或者这是一种不好的做法?

1 个答案:

答案 0 :(得分: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();