Process StandardOutput and StandardError on seperate threads.

Tech-Archive recommends: Fix windows errors by optimizing your registry

From: mwazir (mwazir77_ns_at_hotmail.com)
Date: 05/24/04


Date: Mon, 24 May 2004 14:07:08 +0100

Hi all,

I have reposted this question from dotnet.general as I have been advised
that this is a more appropriate forum for this question. Apologies for the
repost.

I have a process thats starts in my application and only terminates when my
application is terminated. I want to write the output and the errors of this
process to a seperate log file. In order to do this, I spawned two threads.

My code looks something like this

' Starting the process
oProcessStartInfo = New ProcessStartInfo()
With oProcessStartInfo
        .FileName = strFilename
        .Arguments = strArguments
        .UseShellExecute = False
        .CreateNoWindow = True
        .RedirectStandardOutput = True
        .RedirectStandardError = True
End With
oProcess = Process.Start(oProcessStartInfo)

' Starting the threads
        oOutputThread = New Thread(AddressOf ReadStdOut)
        oErrorThread = New Thread(AddressOf ReadStdError)
        With oOutputThread
            .Name = "StandardOutput"
            .Priority = ThreadPriority.BelowNormal
            .Start()
        End With

        With oErrorThread
            .Name = "StandardError"
            .Priority = ThreadPriority.BelowNormal
            .Start()
        End With

    Private Sub ReadStdOut()
        ' Has to run in a seperate thread
        ' ReadtoEnd will work only if the process is getting terminated.
        Dim str As String = oProcess.StandardOutput.ReadLine
        Try
            Do While str.Length >= 0
                If str.Length <> 0 Then
                    Me.oLog.WriteLog("Standard Output : " & str) ' Writes to
a log file.
                End If
                str = oProcess.StandardOutput.ReadLine
            Loop
        Catch
            Return
        End Try
    End Sub

I have a similair ReadStdError function and both share the same instance of
the logging class.
When writing in the log class I implement ReadWriteLock

        ReadWriteLock.AcquireWriterLock(System.Threading.Timeout.Infinite)
        Try
            With oStreamWriter
                .BaseStream.Seek(0, SeekOrigin.End)
                .WriteLine(sDate & " : " & sMessage)
            End With
        Finally
            ReadWriteLock.ReleaseWriterLock() ' Release the write lock.
        End Try

I would like to know if this is the best approach. It works well for me.
However I felt that if I have an infinite loop while reading the standard
output stream, my application would be memory and process intensive and that
hasnt been the case. So I am a bit curious to know why it hasnt been
intensive.

Couple of additional points (not sure of its impact to my question)
- The process doesnt has a irregular stream of data coming from Standard
Output and its not very oft occuring.
- The StandardError by its very nature also doesnt have regular data coming
from it unless there is a real issue. I dont expect any errors if my setups
are correct.
- The Do While Loop should constantly be checking ReadLine - and thats my
real concern

Greateful for any thoughts you may have. I am a complete greenhorn in
threading.

Regards,
Wazir



Relevant Pages

  • Process StandardOutput and StandardError on seperate threads.
    ... repost. ... process to a seperate log file. ... With oProcessStartInfo ... The process doesnt has a irregular stream of data coming from Standard ...
    (microsoft.public.dotnet.general)
  • Re: Help Me
    ... sockets are not part of standard C. ... I recommend that you repost ... Also try to use more readable coding style. ...
    (comp.lang.c)
  • Re: Help Me
    ... sockets are not part of standard C. ... I recommend that you repost ...
    (comp.lang.c)