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

问题描述 投票:3回答:1

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

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

我的代码是:

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事件能够发射一次。为什么要开两次?

c# events process
1个回答
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;
}

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

© www.soinside.com 2019 - 2024. All rights reserved.