I have the following problem and I hope someone will be able to help me with it.
I have a worker in VB .net (2010) which runs a shell-program.
The shell program is a service and output stuff like:
Server initializing...
Server opening port...
more info...
I am able to 'catch' the output of the shell and add it to a textbox (using set text function).
And I am able to Cancel the worker by clicking on a stopbutton, however when there is no more output by the shell I cannot stop the worker anymore.
At least i suspect that's the case.
I've tried checking for endofstream (commented section) but that doesn't work.
I've also tried to same code with some test text in stead of 'clsProcess.StandardOutput.ReadLine' and that also works.
So I came to the conclusion it must have something to do with clsProcess.StandardOutput.ReadLine being at the end???
Try
clsProcess.StartInfo.UseShellExecute = False
clsProcess.StartInfo.RedirectStandardOutput = True
clsProcess.StartInfo.RedirectStandardError = True
clsProcess.StartInfo.FileName = serverpath + config_executable
clsProcess.StartInfo.CreateNoWindow = True
clsProcess.Start()
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, "Error starting server")
Debug.Print(ex.Message)
End Try
Do While Not workerServer.CancellationPending
Try
'If Not clsProcess.StandardOutput.EndOfStream Then
SetText(clsProcess.StandardOutput.ReadLine + vbNewLine)
'End If
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, "Error adding line to log")
End Try
Threading.Thread.Sleep(100)
Loop
clsProcess.Kill()
Any ideas?
Thanks in advance!
Regards,
PH
Presumably this is happening on another thread. Try
Kill()
ing the process from the GUI thread instead of just settingCancellationPending
. You are correct that theReadLine()
call is blocking, causing the while loop to never re-evaluate its condition once there is no more output.Killing the process from another thread should work. (It may throw an exception from
ReadLine()
, so be prepared for that.)