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

3

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

我想处理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事件,然后当所有图片下载完成后会再次触发。
我期望Process.Exited事件只触发一次。为什么会触发两次呢?

1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Alex F
能否请您再仔细地重写倒数第二段?那段话真的很难理解您想要表达什么,除了事件被触发两次外(也就是说,第一个句子之后的所有内容都是混乱的)。 - Peter Duniho
@AlexFarber:这是一个好的猜测,除了我认为OP在倒数第二段说的是事件在进程实际运行时首先被触发。 - Peter Duniho
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;
}

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接