VB.NET在另一个线程上调用BeginInvoke



因此,在注释部分,该人员的代码被翻译为VB.NEThttp://www.codeproject.com/KB/cs/Threadsafe_formupdating.aspx它显示了一些代码来帮助调用跨线程UI的东西。

<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"GvE"中定义的扩展方法"Public Function SafeInvoke(of TResult((ByRef call As System.Func(of frmLogin,TResult((As TResult"中类型参数的数据类型。无法从这些参数推断出Globals"。显式指定数据类型可能会更正此错误。C: \GvE\GvE\frmLogin.vb 37 9 GvE

我错过了什么?我从表单中定义的方法内部调用该代码,但该方法是从另一个线程调用的。

只是试图避免委派,这就是上面的代码应该做的,但就是不能让它发挥作用。

感谢

您的SafeInvoke方法采用Func(Of T, TResult)
这是一个接受T并返回TResult的函数。

由于x.Close()Sub并且不返回任何内容,因此不能将其转换为Func(Of T, TResult)

您应该制作一个重载,该重载需要Action(Of T)–一个接受CCD_ 9并且不返回任何内容的子。

最新更新