Нет вывода в асинхронной программе в vb.net - PullRequest
0 голосов
/ 02 марта 2012

Что я пытаюсь сделать:
Есть три сценария 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

1 Ответ

0 голосов
/ 06 марта 2012

Я нашел решение этой ошибки.В моей асинхронной функции после выполнения вызова начала вызова я завершил подпрограмму, и у подпрограммы, которая вызывалась асинхронно, не было родительского потока, в котором она могла бы сообщить, что вызов завершен.Основной поток должен быть запущен, чтобы увидеть результаты, возвращаемые функцией асинхронного обратного вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...