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

Mat*_*att 4 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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

    ...

End Sub
Run Code Online (Sandbox Code Playgroud)

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

Sve*_*ven 5

可以DoWork使用AddHandler关键字直接引用,就像在C#中一样:

AddHandler bg.DoWork, Sub(sender, e)
                          DoSomething()
                      End Sub
AddHandler bg.RunWorkerCompleted, Sub(sender, e)
                                      IsBusy = False
                                  End Sub
bg.RunWorkerAsync()
Run Code Online (Sandbox Code Playgroud)

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


sta*_*ica 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()
Run Code Online (Sandbox Code Playgroud)

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

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