VB-NET: BeginOutputReadLine gibt erst nach ProzessEnde Daten heraus

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Bit-Hexer.

    VB-NET: BeginOutputReadLine gibt erst nach ProzessEnde Daten heraus

    Hallo zusammen,

    über BeginOutputReadLine versuche ich eine Console-Ausgabe einer exe abzugreifen. (LogFile)


    Hier die Sub dazu:


    Quellcode

    1. Private Sub StartImport()
    2. 'Dim Server As New Process ' >> Umgezogen in die DIMs : Private WithEvents Server As New Process
    3. Dim ProcessInfo As New ProcessStartInfo
    4. ' Absicherung das am Pfadende ein Backslash steht
    5. sV_Converter_Pfad = func_BackslashPruefung(sV_Converter_Pfad)
    6. 'Bedatung der converter-Routine
    7. Server.StartInfo.FileName = sV_Converter_Pfad & sConverter_ApplName
    8. ' Bedatung der Arguments
    9. Server.StartInfo.Arguments = _
    10. " -project " & sConverter_VAR_ProjectName & _
    11. " -in " & sConverter_VAR__Path_and_File & _
    12. " -out " & sV_Converter_VAR_Project_Path & _
    13. " -full " & _
    14. " -filetrace " & sConverter_VAR_filetrace & _
    15. " -consoletrace " & sConverter_VAR_consoletrace & _
    16. " -majornr " & sConverter_VAR_majornr & _
    17. " -minornr " & sConverter_VAR_minornr & _
    18. " -ignorecodefiles 0 " & _
    19. " -ignoreerror 0"
    20. Debug.Print("TS " & SubRoutinen02.funcTimeStamp() & ": " & Server.StartInfo.Arguments)
    21. ' lbl_Status_Info.Text = "Info: Projekt wird erstellt ... bitte warten ..."
    22. Server.EnableRaisingEvents = True
    23. Server.StartInfo.UseShellExecute = False
    24. Server.StartInfo.RedirectStandardOutput = True
    25. Server.StartInfo.CreateNoWindow = True
    26. AddHandler Server.OutputDataReceived, AddressOf OutputDataReceivedHandler
    27. AddHandler Server.Exited, AddressOf Server_Exited
    28. sortOutput = New StringBuilder()
    29. '#### Start eines neuen Prozesses um die Disabled-Funktionen durchführen zu können während die ImportRoutine läuft
    30. Server.Start()
    31. Debug.Print("TS " & SubRoutinen02.funcTimeStamp() & ": " & "Server.Start()")
    32. Server.BeginOutputReadLine()
    33. Debug.Print("TS " & SubRoutinen02.funcTimeStamp() & ": " & "server.BeginOutputReadLine()")
    34. Me.Invoke(Sub()
    35. Me.btn_StartImport.Enabled = False
    36. Me.btn_SYS.Enabled = False
    37. Me.btn_Optionen.Enabled = False
    38. Me.txtbx_Converter_VAR_PDX_Path_and_File.Enabled = False
    39. Me.txtbx_Converter_VAR_ProjectName.Enabled = False
    40. Me.FileDia_Converter_VAR_PDX_Path_and_File.Enabled = False
    41. Me.lbl_Loglevel.Enabled = False
    42. Me.NUpDn_LogLevel.Enabled = False
    43. Me.chkbx_ConsoleAktiv.Enabled = False
    44. End Sub)
    45. End Sub



    Leider fängt der OutputDataReceivedHandler die Ausgaben nicht während der exe-Laufzeit ab, sonder gibt die Lines erst bei Prozessende heraus.
    Den String greife ich zur Laufzeit mit einem BackgroundWorker heraus, der jedoch bei verspäteter Stringausgabe nicht mehr greifen kann.


    Quellcode

    1. Private Sub OutputDataReceivedHandler(sendingProcess As Object, outLine As DataReceivedEventArgs) Handles Server.OutputDataReceived
    2. ' Collect the sort command output.
    3. Me.Invoke(Sub()
    4. Debug.Print("TS " & SubRoutinen02.funcTimeStamp() & ": " & "Aufruf > OutputDataReceivedHandler ")
    5. If Not String.IsNullOrEmpty(outLine.Data) Then
    6. Debug.Print("TS " & SubRoutinen02.funcTimeStamp() & ": " & "OutputDataReceivedHandler > String füllen ")
    7. numOutputLines += 1
    8. ' Add the text to the collected output.
    9. sortOutput.Append(Environment.NewLine + "[" _
    10. + numOutputLines.ToString() + "] - " _
    11. + outLine.Data)
    12. End If
    13. End Sub)
    14. End Sub



    Dasselbe so in C# gecoded läuft einwandfrei - also die Lines werden über den OutputDataReceivedHandler in "Echtzeit" herausgegeben und mit dem BGW abgegriffen.

    Irgendwas muss das mit den Starteigenschaften (?) der exe zu tun haben warum das in C# klappt und in VB nicht.... ?(


    Danke für Infos.....

    Bit-Hexer schrieb:

    VB.NET-Quellcode

    1. 'Dim Server As New Process ' >> Umgezogen in die DIMs : Private WithEvents Server As New Process
    Kannst Du mal bitte einen Code posten, der in sich vollständig ist?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Leider ist das problematisch - die EXE ist vertrauliche Dritt-SW und einige Variablen musste ich verfemden. :/

    Mir ist bewust, dass eine Analyse ohne kompletten Code nicht einfach ist.
    Ich erhoffe mir jedoch kleine Hinweise, die mich zum Ziel führen.

    Markant ist, dass bei nahezu gleicher Syntax C# Ergebnisse spontan liefert und VB nicht.

    Bit-Hexer schrieb:

    bei nahezu gleicher Syntax
    Dann nimm den C#-Code und übersetze ihn nach VB.NET. Tools findest Du dafür genug.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ...und auch hier gibt es einen Fehler....

    Wir haben diverse Tools laufen lassen un kommen zu diesen Ergebnissen:

    (Der Code ist leicht gekürzt - es geht hier nur um die Defintion des EventHandlers)


    C#-Quellcode

    1. public void converter(string sODME_pfad, string sProjekt_pfad, string sProjekt_name, string sMajor, string sMinor)
    2. {
    3. Process myConverter = new Process();
    4. myConverter.StartInfo.UseShellExecute = false;
    5. myConverter.EnableRaisingEvents = true;
    6. myConverter.StartInfo.Arguments = sConverter_Param;
    7. myConverter.StartInfo.CreateNoWindow = true;
    8. myConverter.StartInfo.RedirectStandardOutput = true;
    9. myConverter.Exited += new EventHandler(myConverter_Exited);
    10. myConverter.OutputDataReceived += new DataReceivedEventHandler(myConverter_OutputDataRecieved);
    11. myConverter.Start();
    12. myConverter.BeginOutputReadLine();
    13. Form1.iProzessID = myConverter.Id;
    14. }



    VB.NET-Quellcode

    1. Public Sub converter(sODME_pfad As String, sProjekt_pfad As String, sProjekt_name As String, sMajor As String, sMinor As String)
    2. Dim myConverter As New Process()
    3. myConverter.StartInfo.UseShellExecute = False
    4. myConverter.EnableRaisingEvents = True
    5. myConverter.StartInfo.Arguments = sConverter_Param
    6. myConverter.StartInfo.CreateNoWindow = True
    7. myConverter.StartInfo.RedirectStandardOutput = True
    8. myConverter.Exited += New EventHandler(myConverter_Exited)
    9. myConverter.OutputDataReceived += New DataReceivedEventHandler(myConverter_OutputDataRecieved)
    10. myConverter.Start()
    11. myConverter.BeginOutputReadLine()
    12. Form1.iProzessID = myConverter.Id
    13. End Sub



    Der Code läuft so nicht da der EventHandler nicht die korrekte Syntax hat....

    Also bringt ein umkonvertieren keine brauchbaren Ergebnisse.
    Deswegen starte ich in VB.NET ja auch so:

    VB.NET-Quellcode

    1. Server.EnableRaisingEvents = True
    2. Server.StartInfo.UseShellExecute = False
    3. Server.StartInfo.RedirectStandardOutput = True
    4. Server.StartInfo.CreateNoWindow = True
    5. AddHandler Server.OutputDataReceived, AddressOf OutputDataReceivedHandler
    6. AddHandler Server.Exited, AddressOf Server_Exited
    7. Server.Start()
    8. Server.BeginOutputReadLine()



    Trotzdem macht der VB-NET-Code keine Echtzeit wie es C# macht. :?: