2012-06-07 17 views
0

我进入一个动态定义的循环,将运行onClick控件的函数。Process.Start()给出一个对象引用没有设置为对象的一个​​实例后

的功能如下:

public static void TryOpenFile(string filename, EventHandler callback) 
     { 

       Process proc; 
       proc = Process.Start(filename); 

      if (callback != null) 
       { 
        proc.EnableRaisingEvents = true; 
        proc.Exited += (a, b) => 
         { 
          callback(a, b); 
         }; 
       } 
} 

然后:

for(int i = 0; i < numberOfControls; i++) 
{ 

      controlImg.SetFileToOpen(file, 
       delegate 
       { 
        //exited! 
       }); 

} 
+0

使用Process.WaitForExited或类似的方法 – Zenwalker

回答

2

The documentation for this overload of Process.Start解释发生了什么(重点煤矿):

使用此重载通过指定文件名 启动进程的资源。过载将资源与新的Process 组件相关联。 如果进程已经运行,则不会启动额外的进程 资源。取而代之的是,现有的流程资源被重用 并且不会创建新的流程组件。 在这种情况下,而不是 返回一个新的进程组件,开始返回null为调用 过程。如果你正在使用的ShellExecute使用它的关联,而不是运行一个可执行文件来启动文件

一个新的进程可能无法启动。例如,如果filename是(例如)“C:\ Test.xls”,则它可能启动Excel。但是,如果Excel已经运行,它可能会在现有运行实例中打开文件,而不是启动一个新进程。在这种情况下,proc的值将为空。

+0

非常感谢您的回答。我解决了这个问题。但是现在我遇到了一些问题。请查看我的更新问题。 – Jack

+0

请将您的更新作为新问题发布 –

+0

好的。我删除了更新并做了一个新问题。 – Jack

2

看起来像你的文件名指向一个已经运行的进程。具体根据MSDN documentation

返回值

类型:的System.Diagnostics.Process

与该过程相关联的资源,或,如果一个新的流程组件 没有进程 资源启动(例如,如果现有进程被重用)。

更新:如果您的文件名是一个错误的文件名,它将显然抛出一个异常。

+0

非常感谢您的回答。我解决了这个问题。但是现在我遇到了一些问题。请查看我的更新问题。 – Jack

相关问题