取消通过System.Diagnostics.Process.Start()启动的进程

时间:2012-12-31 01:34:17

标签: c#

我正在编写一个应用程序,我在BackgroundWorker中运行了一个进程。我想支持从用户界面取消,但我没有看到一个简单的方法来做到这一点。

Process实际上是一个相当长时间运行的命令行exe。输出通过Progress.OutputDataReceived事件异步重定向,并用于向GUI报告进度。

private void worker_DoWork(object sender, DoWorkEventArgs e)
{
    using (var process = new Process())
    {
        //...

        process.Start()

        //...

        process.WaitForExit();
    }
}

private void CancelWorker()
{
    worker.CancelAsync();
    // where to actually listen for the cancellation???
}

似乎没有办法让这个过程"听"对于来自StandardInput之外的主线程的任何输入,但除非应用程序本身将响应特定输入以中止,否则它将无法工作。

有没有办法根据主线程的取消请求取消进程?

出于我在流程中运行的EXE的目的,我可以调用Process.Close()退出而没有任何副作用,但Process对象仅为worker_DoWork()所知。方法,所以我需要跟踪Process实例以便取消...这就是为什么我希望有更好的方法。

(如果重要的话,我的目标是.NET 3.5以解决兼容性问题。)

2 个答案:

答案 0 :(得分:4)

对于合作取消,您需要收听BackgroundWorker.CancellationPending   在BackgroundWorker.DoWork  事件。

How to: Use a Background Worker

private void worker_DoWork(object sender, DoWorkEventArgs e)
{
    using (var process = new Process())
    {
        //...

        process.Start()

        //...
        while(true)
        { 
            if ((sender as BackgroundWorker).CancellationPending && !process.HasExited)
            {
              process.Kill();
              break;
            }
            Thread.Sleep(100);
         }

        process.WaitForExit();
    }
}

答案 1 :(得分:-1)

试试这个,这可能会以简单的方式帮助你

private System.Threading.TimerCallback worker;
private System.Threading.Timer workertimer ;
private void worker_DoWork()
{
   //You codes
}
private void StartWorker()
{
   worker = new System.Threading.TimerCallback(worker_DoWork);
   workertimer = new System.Threading.Timer(worker, null, 1000, 1000);
}

private void CancelWorker()
{
    worker.Dispose();
}