5

我正在编写一个应用程序,其中我有一个进程在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 以解决兼容性问题。)

4

2 回答 2

4

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

如何:使用后台工作者

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();
    }
}
于 2012-12-31T03:30:48.673 回答
-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();
}
于 2012-12-31T01:52:30.953 回答