簡體   English   中英

如何使用vb.net中的BackgroundWorker將代碼包裝在lambda表達式中?

[英]How to wrap code in a lambda expression using a BackgroundWorker in vb.net?

考慮以下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包裝在另一個類中(這是我想要進行依賴注入和單元測試的事情)。 我只是不確定如何以簡單,優雅的方式去做。

可以使用AddHandler關鍵字直接引用DoWork ,就像在C#中一樣:

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不允許跨越多行的lambdas(匿名Sub s)。

話雖這么說,您應該能夠定位早期版本的.NET Framework,因為上面的代碼與CLR的版本2兼容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM