Эквивалент C# BeginInvoke ((Действие)) в VB.NET - PullRequest
0 голосов
/ 21 апреля 2020

Мне нужно преобразовать следующий C# код в VB. NET:

if (this.InvokeRequired)
{
    this.BeginInvoke((Action)(() =>
    {
        imageMutex.WaitOne();
        pbCamera.Image = (Bitmap)imageCamera.Clone();
        imageMutex.ReleaseMutex();
    }));
}

Я пробовал это так:

If Me.InvokeRequired Then
    Me.BeginInvoke((Action)(Function()
        imageMutex.WaitOne()
        pbCamera.Image = CType(imageCamera.Clone(), Bitmap)
        imageMutex.ReleaseMutex()
   ))
End If

Но компилятор говорит мне что Action является типом и не может использоваться в качестве выражения. Как бы такой делегат написал в VB. NET?

1 Ответ

3 голосов
/ 21 апреля 2020

Прямой перевод:

    If Me.InvokeRequired Then
        Me.BeginInvoke(DirectCast(
            Sub()
                imageMutex.WaitOne()
                pbCamera.Image = DirectCast(imageCamera.Clone(), Bitmap)
                imageMutex.ReleaseMutex()
            End Sub, 
            Action)
        )
    End If

Как уже отмечали другие, вам не нужно разыгрывать лямбду в действии:

    If Me.InvokeRequired Then
        Me.BeginInvoke(
            Sub()
                imageMutex.WaitOne()
                pbCamera.Image = DirectCast(imageCamera.Clone(), Bitmap)
                imageMutex.ReleaseMutex()
            End Sub
        )
    End If

https://codeconverter.icsharpcode.net имел хороший удар по конвертации. Возможно, стоит подумать, если вы делаете большую работу, где вы находите нужный код в C#, но цепляетесь за пару аспектов преобразования

...