为什么Process.Exited事件会触发两次?

时间:2014-11-04 06:26:47

标签: c# events process

我正在使用Process类和wget.exe在C#中编写应用程序以下载图像。

我想在不调用Process.Exited的情况下处理WaitForExit事件,因为调用WaitForExit会挂起我的UI。为了解决这个问题,我尝试了很多技巧,例如在另一个线程上调用Process.Start()Process.WaitForExit(),使用BackgroundWorker等等。但是,我的UI在某种程度上挂起。所以现在我只想处理Process.Exited没有WaitForExit的事件。

我的代码是:

bool processComplete = false;
Process process = new Process();

private void Start()
{
    process.StartInfo.FileName = "path of wget";
    process.StartInfo.Arguments = "arguments for downloading images";
    process.EnableRaisingEvents = true;
    process.Exited += new EventHandler(Process_Complete);
    process.StartInfo.WindowStyle = ProcessWindowStyle.Hide;            
    process.Start();
}

private void Process_Complete(object sender, EventArgs e)
{
    processComplete = true;
}

开始此过程后,Process.Exited事件将触发两次。首先,如果某些时候下载变得缓慢(如果图像在启动时只有1000以上,只有它会触发process.exited event),然后在下载所有图像之后,正在进行处理,

我希望Process.Exited事件能够触发一次。为什么要开两次?

1 个答案:

答案 0 :(得分:0)

面对同样的问题。 我想这与从不同线程访问进程成员(至少在我的情况下)有关,因为从日志中很明显,从不同线程调用了处理程序。 无论如何,我的解决方案是在事件处理程序中取消订阅事件:

bool processComplete = false;
Process process = new Process();

private void Start()
{
    process.StartInfo.FileName = "path of wget";
    process.StartInfo.Arguments = "arguments for downloading images";
    process.EnableRaisingEvents = true;
    process.Exited += Process_Complete;
    process.StartInfo.WindowStyle = ProcessWindowStyle.Hide;            
    process.Start();
}

private void Process_Complete(object sender, EventArgs e)
{
    process.Exited -= Process_Complete;
    processComplete = true;
}

我认为替代解决方案可能是同步对流程实例的访问(例如,使用锁)。