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

时间:2011-07-25 01:28:31

标签: vb.net thread-safety begininvoke

所以从评论部分,这个人员代码被翻译成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扩展方法'公共函数SafeInvoke(Of TResult)中的类型参数的数据类型(ByRef调用As System.Func(Of frmLogin,TResult))正如在'GvE中定义的'TResult'。无法从这些论点中推断出Globals。明确指定数据类型可能会更正此错误。 C:\ GvE \ GvE \ frmLogin.vb 37 9 GvE

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

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

由于

1 个答案:

答案 0 :(得分:2)

您的SafeInvoke方法需要Func(Of T, TResult) 这是一个需要T 并返回TResult 的函数。

由于x.Close()Sub并且未返回任何内容,因此您无法将其变为Func(Of T, TResult)

你应该做一个带有Action(Of T)的重载 - 一个带T并且不返回任何内容的子。