私がやろうとしていること:
以下に示すように、異なる遅延を持つ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