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

本文关键字:代码 lambda 表达式 BackgroundWorker 包装 vb net | 更新日期: 2023-09-27 18:00:12

考虑以下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事件来设置worker,如下所示:

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

然而,我希望能够在VB.net中实现C#示例中的SomeMethod这样的方法。这可能意味着将Backgroundworker封装在另一个类中(这是我无论如何都想为依赖注入和单元测试做的事情)。我只是不知道如何以一种简单、优雅的方式进行。

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

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

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

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

如果您使用的是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不允许跨多行的lambda(即匿名Sub)。

话虽如此,您应该能够针对.NET Framework的早期版本,因为上面的代码与CLR的版本2兼容。