【发布时间】: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:不是奖品。而是名声。可以把它想象成说“感谢您为回答我的问题和帮助我付出的努力”
-
回到几个问题。我想我现在明白了。那个灰色的复选标记以前从未在我眼中脱颖而出。这个网站在视觉上是如此忙碌。我会回去检查答案。感谢您指出这一点。
-
你不应该打电话给
BeginInvoke和EndInvoke。相反,如果您想等待它运行,请致电Invoke,如果您不想等待,请致电BeginInvoke。
标签: vb.net thread-safety begininvoke