我一直在尝试让一个函数与GUI窗口异步工作,但只取得了非常有限的成功。
下面的代码是我的函数XXX,它有一个委托和回调--允许停止GUI线程,而不会得到错误。
但是,如果它是一个Sub,而不是一个函数,并且它没有任何参数,那么它就可以工作。
我不知道如何更改它,以便检查它的返回值...我在一些例子中发现了一些帮助,http://msdn.microsoft.com/en-us/library/system.iasyncresult.asyncstate.aspx -但是他们在回调中打印返回值,而我不知道如何在调用者中获得返回值。
我找不到任何在函数中使用参数的方法。
Private Function XXX_Callback(ByVal ia As IAsyncResult)
Dim d As XXXDelegate = CType(CType(ia, Runtime.Remoting.Messaging.AsyncResult).AsyncDelegate, XXXDelegate)
d.EndInvoke(ia)
Dim result As AsyncResult = CType(ia, AsyncResult)
Dim caller As XXXDelegate = CType(result.AsyncDelegate, XXXDelegate)
Dim returnValue As Boolean = caller.EndInvoke(ia)
XXX_Finish() ' needs the "vvv argument, I don't know how to get it
' The returnValue is here but I don't know how to send it to the caller
End Function
'Private Function XXX_Finish(ByVal vvv as Boolean) As Boolean
' this probably needs to return something, I don't know what/ how to get it
Private Function XXX_Finish() As Boolean
' something
myGui.Finish()
End Function
' Private Delegate Function XXXDelegate(ByVal vvv As Integer) As Boolean
' Public Function XXX(ByVal vvv As Integer) As Boolean ' This is what I would like
Private Delegate Sub XXXDelegate()
Public Sub XXX()
'
myGui.Update()
'
End Sub
Public Sub Caller()
'
myGui = New SomeGui()
myGui.Begin()
Dim t As New XXXDelegate(AddressOf XXX)
t.BeginInvoke(AddressOf XXX_Callback, Nothing)
' more code, another call
End Sub
Private myGui As SomeGui有没有人能帮我把这件事做得更好,或者给出一些有帮助的例子?有了我在过去两天找到的那些,我已经走到了死胡同…
谢谢。
发布于 2013-01-31 00:04:38
在网上搜索了大量的帖子,读了几本书后,我找到了最好的资源,并给出了可能遇到的每个案例的例子:
http://support.microsoft.com/kb/315582
这个特定问题的答案在上面的链接中,“示例2:使用EndInvoke()调用模式异步调用方法”和“示例5:当异步方法完成时执行回调”。
不过,它最好的地方是简单而有条理地解释了使用Invoke、EndInvoke和Callback的选项。
需要注意的一件事:对于我上面的问题,最根本的突破是当我读到"BeginInvoke()立即返回,不等待异步调用完成。“
所以..。在它之后尝试调用另一个方法是错误的方法。
发布于 2016-02-12 05:07:27
这就是我进行异步函数调用的方式。
我在模块中声明了这个函数。
Private Delegate Function fnBolAsyncCallVerificacionNuevaVersion(ByVal pIntModo As Integer, ByVal pIntAccion As Integer) As Boolean
Private Delegate Function fnBolAsyncCallActualizacionTipoCambio(ByVal pIntActualizacionMandatoria As clsBusinessBoxData.tblTipoCambio.enumActualizacionMandatoria) As typBolResultadoFuncion这两个函数接收一些参数,第一个函数返回一个布尔值,第二个函数返回一个包含2个数据、一个布尔值和一个字符串的结构。
在表单的load事件中,我调用函数。
sAsyncVerificaVersion = New fnBolAsyncCallVerificacionNuevaVersion(AddressOf fnBolVerificaActualizacion)
sAsyncVerificaVersion.BeginInvoke(enumDisplayGUIMode.Silent, typApplicationUpdate.CheckOnly, New AsyncCallback(AddressOf fnBolTerminaVerificacionVersion), Nothing)
sAsyncActualizaTiposCambio = New fnBolAsyncCallActualizacionTipoCambio(AddressOf fnBolActualizaTiposCambioYahoo)
sAsyncActualizaTiposCambio.BeginInvoke(clsBusinessBoxData.tblTipoCambio.enumActualizacionMandatoria.No, New AsyncCallback(AddressOf fnBolTerminaActualizacionTipoCambio), Nothing)这些调用将异步执行函数,并在完成时回调定义的函数。
然后,我在定义的回调函数中接收结果。
Private Function fnBolTerminaVerificacionVersion(ByVal pIarResultado As IAsyncResult) As Boolean
Dim sClsResultado = CType(pIarResultado, Messaging.AsyncResult)
Dim sIarResultado As fnBolAsyncCallVerificacionNuevaVersion = CType(sClsResultado.AsyncDelegate, fnBolAsyncCallVerificacionNuevaVersion)
Dim sBolExisteNuevaVersion As Boolean = False
CheckForIllegalCrossThreadCalls = False
sBolExisteNuevaVersion = sIarResultado.EndInvoke(pIarResultado)
mnuBajarActualizacion.Enabled = sBolExisteNuevaVersion
CheckForIllegalCrossThreadCalls = True
Return True
End Function
Private Function fnBolTerminaActualizacionTipoCambio(ByVal pIarResultado As IAsyncResult) As Boolean
Dim sBolActualizacionExitosa As typBolResultadoFuncion
Dim sClsResultado = CType(pIarResultado, Messaging.AsyncResult)
Dim sIarResultado As fnBolAsyncCallActualizacionTipoCambio = CType(sClsResultado.AsyncDelegate, fnBolAsyncCallActualizacionTipoCambio)
CheckForIllegalCrossThreadCalls = False
sBolActualizacionExitosa = sIarResultado.EndInvoke(pIarResultado)
CheckForIllegalCrossThreadCalls = True
Return True
End Function我希望他们能帮上忙。
https://stackoverflow.com/questions/14448887
复制相似问题