Что я пытаюсь сделать:
Есть три сценария PowerShell с разными временными задержками, как показано ниже. Я пытаюсь запустить их асинхронно в .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