【问题标题】:VB.NET Calling BeginInvoke on another threadVB.NET 在另一个线程上调用 BeginInvoke
【发布时间】:2011-07-25 01:28:30
【问题描述】:

因此,从 http://www.codeproject.com/KB/cs/Threadsafe_formupdating.aspx 将这些人的代码转换为 VB.NET 的 cmets 部分,它显示了一些有助于调用跨线程 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. Globals' 不能从这些论点中推断出来。明确指定数据类型可能会更正此错误。 C:\GvE\GvE\frmLogin.vb 37 9 GvE

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

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

谢谢

【问题讨论】:

  • 你用的是什么版本的VB.Net?
  • 3.5 对不起,米奇,我该怎么办?是否有某种我应该单击的接受答案按钮,这是否会给回答某种奖品的人?抱歉,我想我只是像对待任何其他论坛一样对待这个问题,但也许我可以回去修复它。
  • @user441521:不是奖品。而是名声。可以把它想象成说“感谢您为回答我的问题和帮助我付出的努力”
  • 回到几个问题。我想我现在明白了。那个灰色的复选标记以前从未在我眼中脱颖而出。这个网站在视觉上是如此忙碌。我会回去检查答案。感谢您指出这一点。
  • 你不应该打电话给BeginInvokeEndInvoke。相反,如果您想等待它运行,请致电Invoke,如果您不想等待,请致电BeginInvoke

标签: vb.net thread-safety begininvoke


【解决方案1】:

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

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

您应该创建一个采用 Action(Of T) 的重载 - 一个采用 T 并且不返回任何内容的 sub。

【讨论】:

  • 很酷,谢谢(有点)。使用这种作品显示另一种形式,但它挂起。我会看看我能想出什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
  • 2021-07-19
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
相关资源
最近更新 更多