如何使用vb.net中的BackgroundWorker将代码包装在lambda表达式中?

时间:2011-06-24 17:07:21

标签: c# vb.net events lambda backgroundworker

考虑以下C#代码:

private void SomeMethod()
{
    IsBusy = true;
    var bg = new BackgroundWorker();
    bg.DoWork += (sender, e) =>
    {
      //do some work
    };
    bg.RunWorkerCompleted += (sender, e) =>
    {
      IsBusy = false;
    };
    bg.RunWorkerAsync();
}

我知道VB.NET不允许像这样直接引用DoWork,你必须通过说Private WithEvents Worker As BackgroundWorker并明确处理DoWork事件来设置工作人员,如下所示:

Private Sub Worker_DoWork( 
            ByVal sender As Object,
            ByVal e As DoWorkEventArgs) _
            Handles Worker.DoWork

    ...

End Sub

但是,我希望能够在VB.net中的C#示例中实现类似SomeMethod的方法。可能这意味着将Backgroundworker包装在另一个类中(这是我想要进行依赖注入和单元测试的事情)。我只是不确定如何以简单,优雅的方式去做。

2 个答案:

答案 0 :(得分:5)

可以直接引用{C}中的DoWork,方法是使用AddHandler关键字:

AddHandler bg.DoWork, Sub(sender, e)
                          DoSomething()
                      End Sub
AddHandler bg.RunWorkerCompleted, Sub(sender, e)
                                      IsBusy = False
                                  End Sub
bg.RunWorkerAsync()

请注意,这仅适用于VB10,因为早期版本的VB不支持多语句lambdas。

答案 1 :(得分:5)

如果您使用的是VB.NET 10(Visual Studio 2010附带),则以下内容应该可以正常工作:

Dim bg = New BackgroundWorker()
AddHandler bg.DoWork,
    Sub()
        DoSomething()
    End Sub
AddHandler bg.RunWorkerCompleted,
    Sub()
        IsBusy = False
    End Sub
bg.RunWorkerAsync()

这里需要VB.NET 10,因为早期版本的VB.NET不允许跨越多行的lambdas(匿名Sub)。

话虽这么说,您应该能够定位早期版本的.NET Framework,因为上面的代码与CLR的第2版兼容。