VB.NET Вызов BeginInvoke в другом потоке - PullRequest
1 голос
/ 25 июля 2011

Таким образом, из раздела комментариев, где этот код персоны был переведен в 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)) As TResult', определенный в 'GvE. Глобалы не могут быть выведены из этих аргументов. Явное указание типа данных может исправить эту ошибку. C: \ GvE \ GvE \ frmLogin.vb 37 9 GvE

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

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

Спасибо

1 Ответ

2 голосов
/ 25 июля 2011

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

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

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

...