我正在用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 event
),然后在下载所有图像之后,正在进行处理。
我希望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;
}
我认为替代解决方案可能是同步访问流程实例(例如使用锁)。