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包装在另一个类中(这是我想要进行依赖注入和单元测试的事情).我只是不确定如何以简单,优雅的方式去做.
您可以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.
如果您使用的是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兼容.