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

4

1 回答 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();
于 2013-04-05T10:44:01.747 回答