1

因此,从http://www.codeproject.com/KB/cs/Threadsafe_formupdating.aspx上此人代码被翻译成 VB.NET 的评论部分,它显示了一些代码来帮助调用跨线程 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 ​​扩展方法 'Public Function SafeInvoke(Of TResult)(ByRef call As System.Func(Of frmLogin, TResult)) As TResult 中的类型参数的数据类型在 'GvE.Globals' 中定义不能从这些论点中推断出来。明确指定数据类型可能会更正此错误。C:\GvE\GvE\frmLogin.vb 37 9 GvE

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

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

谢谢

4

1 回答 1

2

你的SafeInvoke方法需要一个Func(Of T, TResult).
这是一个接受 aT 并返回 aTResult的函数。

由于x.Close()is aSub并且不返回任何内容,因此您不能将其变为 a Func(Of T, TResult)

你应该做一个带 a 的重载Action(Of T)——一个带 aT并且不返回任何东西的 sub。

于 2011-07-25T01:46:12.730 回答