如何在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封装在另一个类中(这是我无论如何都想为依赖注入和单元测试做的事情)。我只是不知道如何以一种简单、优雅的方式进行。
您可以像在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兼容。