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

誰かが私がこれをより良い形にするのを手伝ってくれるでしょうか、それとも助けになるいくつかの例を手に入れることができますか?過去2日間に見つけたもので、行き止まりになりました...

ありがとうございました。

4

2 に答える 2

0

Web上の多くの投稿を検索し、数冊の本を読んだ後、私は、遭遇する可能性のある各ケースの例とともに、最良のリソースを見つけました。

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

この特定の質問に対する回答は、上記のリンク「サンプル2:EndInvoke()呼び出しパターンを使用してメソッドを非同期的に呼び出す」および「サンプル5:非同期メソッドが完了したときにコールバックを実行する」にあります。

それについての最もよいことは、Invoke、EndInvoke、Callbackを使用するためのオプションが説明されているシンプルで組織化された方法です。

注意すべき点の1つは、上記の質問で、「 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番目の関数は2つのデータ(1つのブール値と1つの文字列)を持つ構造体を返します。

フォームの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)

これらの呼び出しは、関数asyncronousを実行し、終了時に定義された関数をコールバックします。

次に、定義されたコールバック関数で結果を受け取ります。

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 に答える