为什么Process Exited事件会一直自动升起?

时间:2013-08-04 21:05:15

标签: c# winforms

在Form1的顶部,我做了:

private Process zipFileDirectoryProcess;

在构造函数中我做了:

zipFileDirectoryProcess = new Process();
zipFileDirectoryProcess.StartInfo.FileName = "explorer.exe";
zipFileDirectoryProcess.StartInfo.CreateNoWindow = true;
zipFileDirectoryProcess.EnableRaisingEvents = true;
zipFileDirectoryProcess.Exited += new EventHandler(zipFileDirectoryProcess_Exited);

然后我有一个方法,我从按钮点击事件中调用它:

private void Compress()
{
  zipFileDirectoryProcess.StartInfo.Arguments = zipFileDirectoryProcess.StartInfo.Arguments = "/select," + Path.GetFullPath(t);
  zipFileDirectoryProcess.Start();
  zipFileDirectoryProcess.WaitForExit();
  this.TopMost = true;
}

然后在底部退出事件:

private void zipFileDirectoryProcess_Exited(object sender, EventArgs e)
        {
            this.BeginInvoke(new MethodInvoker(delegate()
            {
                this.TopMost = false;
            }));
        }

我想要做的只是当我在方法中启动它之后关闭进程窗口时才关闭窗口/进程然后执行Exited事件。

问题是,一旦过程在2-3秒后开始,它就会自动跳转到退出事件。

我该如何解决?尝试过的例子无法弄清楚。 试图添加这一行:

zipFileDirectoryProcess.WaitForExit();

但没有效果。

2 个答案:

答案 0 :(得分:5)

   zipFileDirectoryProcess.StartInfo.FileName = "explorer.exe";

尝试在Windows资源管理器已经运行时再次启动,并且它始终在运行,将会产生令人失望的结果。这是一个“沉重”的过程,它故意尝试最小化运行副本的数量。否则称为“单实例应用程序”。有很多类似的,例如,Microsoft Office程序就是单实例应用程序。

所以真正发生的是explorer.exe实际启动,但看到另一个实例已经在运行。并使用进程互操作来请求第一个实例来完成您要求它执行的工作。由于您没有要求它执行任何操作,因此您只需获取另一个窗口,该窗口由第一个实例显示。你开始的那个立即退出,它没有别的事可做。

所以,是的,你会看到退出的事件在没有你做任何事情的情况下发生。准确地告诉你,你启动的explorer.exe进程实际上已经退出了。很容易在Taskmgr.exe进程选项卡btw中看到。等待该窗口关闭永远不会起作用,它由explorer.exe的原始实例显示。

这将无法按照您希望的方式运作。你实际上要做的事情并不是很明显,但可以猜到。创建ZIP存档并不困难,C#可以使用优秀的库来完成工作,没有必要让其他程序为您完成。 DotNetZip和SharpZipLib非常受欢迎。它最终被添加到.NET以及版本4.5中,微软终于克服了丢失的Stacker诉讼,关于时间问题。如果你真的,真的想要另一个程序为你做,那么使用控制台模式拉链,如7-zip。

答案 1 :(得分:0)

要在Windows资源管理器中向用户显示输出文件夹,只需执行此操作即可:

Process.Start("explorer.exe", OutputDir);