2012-03-01 18 views
0

私がやろうとしていること:
以下に示すように、異なる遅延を持つ3つのpowershellスクリプトがあります。私は.NETで非同期にそれらを実行しようとしています。私はこれを参考にしてAsyncrhonousプログラミングを実装しました。article
のIは、イベントが呼び出された後、出力を取得することはできませんよ。私は立ち往生していますvb.netの非同期プログラムの出力がありません

。スクリプトは呼び出されていますが、プログラムは終了し、コンソールウィンドウで「何かキーを押して続行してください」と表示されます。私はここで紛失しているものではありません。 私はどこが間違っているのか考えていますか?

Info:JobRequestは、ジョブを追跡する情報を渡すために使用するクラスです。

非同期プログラミングに関する簡単でわかりやすい説明がある場合は、すべての記事が混乱しているので、それを提供してください。

Sub Main() 

     OurAsyncFunctionCalling("psDelayScript2.ps1", "-arg1 4 -arg2 5", 1) 
     OurAsyncFunctionCalling("psDelayScript1.ps1", "-arg1 2 -arg2 3", 2) 
     OurAsyncFunctionCalling("psDelayScript.ps1", "-arg1 1 -arg2 1", 3) 

    End Sub 
    Delegate Function AsyncMethodHandler(ByVal ScriptFile As String, ByVal ScriptParameters As String, ByVal id As String) As JobRequest 

    Public Function RunScript(ByVal ScriptFile As String, ByVal ScriptParameters As String, ByVal id As String) As JobRequest 
     Dim job1 As New JobRequest 

     Dim start As New ProcessStartInfo 
     Dim ScriptsFolder As String = "C:\BadTempScripts" 

     ' start.FileName = "C:\WINDOWS\system32\cscript.exe" 
     start.FileName = "powershell.exe" 
     start.Arguments = ScriptsFolder + "\" + ScriptFile + " " + ScriptParameters 
     start.UseShellExecute = False 
     start.RedirectStandardOutput = True 
     start.RedirectStandardError = True 

     Dim myproc As New Process 
     myproc.StartInfo = start 
     myproc.Start() 
     Dim so As System.IO.StreamReader 
     Dim se As System.IO.StreamReader 
     se = myproc.StandardError 
     so = myproc.StandardOutput 
     myproc.WaitForExit() 
     job1.StandardError = so.ReadToEnd 
     job1.StandardOutput = so.ReadToEnd 
     Return job1 
    End Function 

    Public Sub OurAsyncFunctionCalling(ByVal strfile As String, ByVal strparameter As String, ByVal intid As Integer) 
     Dim caller As AsyncMethodHandler 
     caller = New AsyncMethodHandler(AddressOf RunScript) 
     caller.BeginInvoke(strfile, strparameter, intid, AddressOf Callbackmethod, Nothing) 
    End Sub 

    Private Sub Callbackmethod(ByVal ar As IAsyncResult) 
     Try 

      Dim result As AsyncResult = CType(ar, AsyncResult) 
      Dim caller As AsyncMethodHandler = CType(result.AsyncDelegate, AsyncMethodHandler) 
      Dim returnvalue As JobRequest = caller.EndInvoke(ar) 
      UpdateProcessCompleteLogic(returnvalue) 
     Catch ex As Exception 

     End Try 
    End Sub 
    Delegate Sub UpdateProcessCompleteHandler(ByVal jr As JobRequest) 
    Public Sub UpdateProcessCompleteLogic(ByVal jr As JobRequest) 
     Dim updatehandler As New UpdateProcessCompleteHandler(AddressOf updateprocess) 

     Dim results As JobRequest = jr 
    End Sub 
    Sub updateprocess(ByVal jr As JobRequest) 
     Console.WriteLine(jr.StandardError) 
     Console.WriteLine(jr.StandardOutput) 
    End Sub 

答えて

0

私はこの間違いに対する解決策を見つけました。私の非同期関数では、begin invokeコールを実行した後、ルーチンを終了し、非同期に呼び出されたサブルーチンには、呼び出しが完了したことを報告できる親スレッドがありませんでした。非同期コールバック関数から返される結果を確認するには、メインスレッドが実行されている必要があります。

関連する問題