我正在用 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/