我正在使用Process
类和wget.exe
在C#中编写应用程序以下载图像。
我想在不调用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
事件能够触发一次。为什么要开两次?
答案 0 :(得分: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;
}
我认为替代解决方案可能是同步对流程实例的访问(例如,使用锁)。