同时跟踪多个流程

时间:2011-04-29 12:11:56

标签: c# .net windows process process.start


 我有一个应用程序(winforms)将文件下载到用户的临时文件夹,然后打开文件供用户查看内容,当文件关闭时,文件将从临时文件夹中删除。如果我打开让我们说一个.pdf和一个.doc应用程序正常工作当尝试打开一个.doc时,如果另一个winword进程仍在运行(如果由我的应用程序打开或由用户直接打开),则会出现问题

我正在使用以下代码:

_OpenFileProces = System.Diagnostics.Process.Start(TempFileName);
_OpenFileProces.EnableRaisingEvents = true;
_OpenFileProces.Exited += new EventHandler(_OpenFileProces_Exited);

这个用来清除温度

void _OpenFileProces_Exited(object sender, EventArgs e)
    {
        string s = ((System.Diagnostics.Process)sender).StartInfo.FileName;
        System.IO.File.Delete(s);
    }

似乎正在运行的进程正在停止我自己...并且由于停止它会删除文件,否则在尝试删除文件时会产生错误。
您有什么建议我如何打开自己的流程?问题是我不知道我必须打开哪种文件类型(它可能是任何东西)而且我依靠Windows来选择最好的应用程序。从我的测试中,记事本工作正常,但是winword和acrobat关闭了我的过程 谢谢

2 个答案:

答案 0 :(得分:2)

我怀疑Microsoft Word在这里完全一样,因为Raymond Chen将Windows Shell描述为here

  

客户希望获得有关监控资源管理器窗口生命周期的帮助。

     
    

我们要启动资源管理器的副本以打开特定的文件夹,然后等到用户关闭文件夹后再继续。我们尝试在命令行上使用该文件夹启动资源管理器的副本,然后执行进程句柄上的WaitForSingleObject,但等待有时会立即完成而不等待。我们如何等待用户关闭资源管理器窗口?

  
     

这是另一个解决问题的情况,然后在另一半遇到麻烦。

     

Wait­For­Single­Object立即返回的原因是Explorer是一个单实例程序(好的,有限实例)。当您打开资源管理器窗口时,请求将被移交给正在运行的资源管理器副本,并且您启动的资源管理器副本将退出。这就是你的Wait­For­Single­Object立即返回的原因。

在您的情况下,Word已在运行,因此当您创建第二个 Word进程并指示它打开您的文档时,它只是将请求发送到已经运行的Word实例,并退出您立即启动的第二个流程。

当你描述“正在运行的过程正在阻止我自己”时,你就会看到这一点。因为第二个实例在启动后会立即关闭,所以会引发Exited事件并且您的代码会告诉它删除该文件!

你清楚地发现记事本(不像Word和Adobe Acrobat)工作得很好。这是因为Notepad被设计为多实例应用程序。您可以根据需要打开任意数量的记事本;它不关心桌面上是否已打开1或6个副本。更重要的是,要求shell在记事本中打开文本文档实际上会打开记事本应用程序的第二个副本,而不是向第一个实例发送请求以打开新文档的新窗口。

答案 1 :(得分:1)

你应该在开始这个过程之前将Process.StartInfo.UseShellExecute设置为true,如_OpenFileProces.StartInfo.UseShellExecute = true;,然后它应该可以工作我认为......