Как обернуть код в лямбда-выражение, используя BackgroundWorker в vb.net? - PullRequest
4 голосов
/ 24 июня 2011

Рассмотрим следующий код 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

Однако я хотел бы иметь возможность реализовать метод, подобный SomeMethod из примера C # в VB.net. Скорее всего, это означает обертывание Backgroundworker в другом классе (что я в любом случае хочу сделать для внедрения зависимостей и модульного тестирования). Я просто не уверен, как это сделать простым и элегантным способом.

Ответы [ 2 ]

5 голосов
/ 24 июня 2011

Если вы используете 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 не разрешали лямбда-выражения (анонимные Sub s), которые занимают более одной строки.

При этом вы должны иметь возможность нацеливаться на более ранние версии .NET Framework, поскольку приведенный выше код совместим с версией 2 CLR.

5 голосов
/ 24 июня 2011

Вы можете напрямую ссылаться на DoWork, как в C #, используя ключевое слово AddHandler:

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

Обратите внимание, что это работает только на VB10, так как более ранние версии VB не поддерживают лямбда-выражения с несколькими операторами.

...