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
и ничего не возвращает.