我正在编写一个应用程序,我在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以解决兼容性问题。)
答案 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();
}