2012-03-01 11 views
0

我在做什麼:
有三種不同時間延遲的powershell腳本,如下所示。我試圖在.NET中異步運行它們,我遵循這個article來實現Asyncrhonous編程。vb.net中的異步程序中沒有輸出

如果我堅持:
的我不能被調用的事件後檢索輸出。腳本正在被調用,但程序結束,並在控制檯窗口中顯示「按任意鍵繼續」。我不在這裏失蹤。 任何想法,我做錯了?

信息: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

我發現了這個錯誤的解決方案。在我的異步函數中,在完成開始調用調用之後,我結束了例程,並且異步調用的子例程沒有任何父線程,它可以報告調用已完成。主線程應該正在運行,以便查看從異步回調函數返回的結果。