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