【问题标题】:Why does the Process.Exited event fire two times?为什么 Process.Exited 事件会触发两次?
【发布时间】:2014-11-04 06:26:47
【问题描述】:

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

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

【问题讨论】:

  • 你确定Start函数没有执行两次吗?还有其他订阅 Process_Complete 的地方吗?
  • 能否请您改写倒数第二段,这次更仔细些?除了事件被引发两次(即第一句之后的所有内容都是乱码)之外,真的很难理解你想说什么。
  • @AlexFarber:这是一个很好的猜测,除了我 认为 OP 在他的倒数第二段中说,在进程进行时首先引发事件仍在运行。

标签: c# events process


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-10-05
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多