0

我一直在尝试让一个函数与 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

拜托,有人可以帮我把它变成一个更好的形状,或者得到一些有帮助的例子吗?用这两天找的那些,我已经走到了死胡同……

谢谢你。

4

2 回答 2

0

在网上搜索了很多帖子并阅读了几本书之后,我找到了最好的资源,并为每个人可能遇到的每个案例提供了示例:

http://support.microsoft.com/kb/315582

这个特定问题的答案在上面的链接中,“示例 2:使用 EndInvoke() 调用模式异步调用方法”和“示例 5:在异步方法完成时执行回调”。

最好的一点是简单而有条理的方式,其中解释了使用 Invoke、EndInvoke、Callback 的选项。

需要注意的一点:对于我上面的问题,重要的突破是当我读到“ BeginInvoke() 立即返回并且不等待异步调用完成时。

所以......试图在它之后调用另一种方法是错误的方法。

于 2013-01-30T16:04:38.143 回答
0

这就是我进行异步函数调用的方式。

我在模块中声明了函数。

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 个数据、一个布尔值和一个字符串的结构。

在表单的加载事件中,我调用函数。

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

我希望他们有所帮助。

于 2016-02-11T21:07:26.973 回答