Cancelling background-worker

試著忘記壹切 提交于 2019-12-25 07:46:55

问题


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


回答1:


Presumably this is happening on another thread. Try Kill()ing the process from the GUI thread instead of just setting CancellationPending. You are correct that the ReadLine() 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.)



来源:https://stackoverflow.com/questions/4188228/cancelling-background-worker

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!