VB.NET Вызов BeginInvoke в другом потоке

Таким образом, из раздела комментариев, где этот код персоны был переведен в VB.NET на http://www.codeproject.com/KB/cs/Threadsafe_formupdating.aspx он показывает небольшой код для помощи в вызове кросс-поточного интерфейса.

<System.Runtime.CompilerServices.Extension()> _
Public Function SafeInvoke(Of T As ISynchronizeInvoke, TResult)(ByRef isi As T, ByRef [call] As Func(Of T, TResult)) As TResult
    If isi.InvokeRequired Then
        Dim result As IAsyncResult = isi.BeginInvoke([call], New Object() {isi})
        Dim endResult As Object = isi.EndInvoke(result)
        Return DirectCast(endResult, TResult)
    Else
        Return [call](isi)
    End If
End Function

Однако, когда я пытаюсь вызвать следующее, я получаю сообщение об ошибке:

Me.SafeInvoke(Function(x) x.Close())

или же

frmLobby.SafeInvoke(Function(x) x.Close())

Ошибка 1 Тип (ы) данных параметра (ов) типа в методе расширения "Открытая функция SafeInvoke(Of TResult)" (вызов ByRef As System.Func(Of frmLogin, TResult)) "TResult", определенный в "GvE.Globals", не может быть выведенным из этих аргументов. Явное указание типов данных может исправить эту ошибку. C:\GvE\GvE\frmLogin.vb 37 9 GvE

Что мне не хватает? Я вызываю этот код из метода, определенного в форме, но этот метод вызывается из другого потока.

Просто пытаюсь избежать делегатов, и это то, что должен делать приведенный выше код, но просто не может заставить его работать.

Спасибо

1 ответ

Решение

Ваш SafeInvoke метод занимает Func(Of T, TResult),
Это функция, которая принимает T и возвращаетTResult,

поскольку x.Close() это Sub и ничего не возвращает, вы не можете сделать это в Func(Of T, TResult),

Вы должны сделать перегрузку, которая занимает Action(Of T) - подводная лодка, которая занимает T и ничего не возвращает.

Другие вопросы по тегам