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