我正在编写一个应用程序,其中有一个进程在 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 以解决兼容性问题。)
最佳答案
合作取消需要监听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();
}
}
关于c# - 取消通过 System.Diagnostics.Process.Start() 启动的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14096545/