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

标签 c# events process

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

我想在不调用 WaitForExit 的情况下处理 Process.Exited 事件,因为调用 WaitForExit 会挂起我的 UI。为了解决这个问题,我尝试了很多技术,比如在另一个线程上调用 Process.Start()Process.WaitForExit(),使用 BackgroundWorker 等。不过,我的用户界面仍然卡在某个级别。所以现在我想简单地处理 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 事件触发一次。为什么会触发两次?

最佳答案

遇到了同样的问题。 我想这与从不同线程访问进程成员有某种关系(至少在我的情况下),因为从日志中可以清楚地看出处理程序是从不同线程调用的。 无论如何,我的解决方案是取消订阅事件处理程序中的事件:

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;
}

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

关于c# - 为什么 Process.Exited 事件会触发两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26728952/

相关文章:

java - 如何为 Java 程序设置进程名称?

vb.net - 如何知道浏览器是否真的完成浏览

android - 通过Java编程语言在android中读取/dev/input/event

WPF:有没有办法有条件地更改 XAML 中的属性值或需要隐藏代码 (VB/C#)?

c++ - Qt5.4.1升级到5.12.1,现在QCodec报异常

C# hex byte 0x09 (ascii -> tab) to "\t"string

c# - 在另一个范围内赋予不同的含义

python - 检查python是否安装

c# - 后面代码中的拼写检查类

windows - 如何在 Windows 中监视进程/程序执行?