C#阻止代码直到进程释放文件句柄

C#阻止代码直到进程释放文件句柄,c#,.net,process,C#,.net,Process,我有一个foreach循环,它在try/catch中启动一个进程。在try/catch/finally的finally部分中,我试图确保该进程对任何文件都没有句柄。我必须删除正在处理的文件 我试过的东西似乎都不管用。我继续得到System.IO异常。“另一个进程当前正在使用该文件。” 您可以在finally中看到,在从该方法返回之前,我正在使用WaitForExit()。下一个方法调用是删除文件。为什么进程在此之后仍然处于打开状态或对这些文件中的任何一个拥有句柄 谢谢 try { fore

我有一个foreach循环,它在try/catch中启动一个进程。在try/catch/finally的finally部分中,我试图确保该进程对任何文件都没有句柄。我必须删除正在处理的文件

我试过的东西似乎都不管用。我继续得到System.IO异常。“另一个进程当前正在使用该文件。”

您可以在finally中看到,在从该方法返回之前,我正在使用WaitForExit()。下一个方法调用是删除文件。为什么进程在此之后仍然处于打开状态或对这些文件中的任何一个拥有句柄

谢谢

try
{
   foreach (var fileInfo in jsFiles)
   {
     //removed for clarity
     _process.StartInfo.FileName = "\"C:\\Program Files\\Java\\jre6\\bin\\java\"";
     _process.StartInfo.Arguments = stringBuilder.ToString();
     _process.StartInfo.UseShellExecute = false;
     _process.StartInfo.RedirectStandardOutput = true;
     _process.Start();
   }
 }
 catch (Exception e)
 {
   BuildMessageEventArgs args = new BuildMessageEventArgs("Compression Error: " + e.Message,
                                string.Empty, "JSMin", MessageImportance.High);
   BuildEngine.LogMessageEvent(args);

 }
 finally
 {
   _process.WaitForExit();
   _process.Close();
 }

该过程是控制台应用程序还是GUI应用程序


对于GUI应用程序,您必须执行Process.CloseMainWindow。

这里有严重错误。您正在启动一系列进程,但只等待最后生成的进程退出

您确定不希望将
foreach
置于try块之外吗


如果你能告诉我们你到底想做什么,我们可以提供更好的建议。

我认为你需要重新构造你的代码。因此,
foreach
中任何进程的失败都将导致退出循环。即使一切都成功了,
finally
块中的
WaitForExit
Close
调用也只会处理上面循环中的最后一个进程

您需要单独处理每个流程及其成功和/或失败。创建一个方法,该方法接受
fileInfo
参数,并生成和等待每个进程。将循环移动到将调用建议方法的客户端代码中

foreach (var fileInfo in jsFiles)
{
    using (Process process = new Process())
    {
        try
        {
            //Other stuff
            process.Start();
        }
        catch (...)
        {
            //Exception Handling goes here...
        }
        finally
        {
            try
            {
                process.WaitForExit();
            }
            catch (...)
            {
            }
        }
    }
}
  • Process.WaitForExit()
    可能会引发异常,因此它需要自己尝试/捕获
  • 如果使用语句在
    中创建进程,则不必担心关闭它,.NET将正确地处理它
  • 通常最好不要在局部变量前面加下划线。大多数人只是把它用于他们的领域

  • 这当然是个问题。我误解了开头。我的印象是原来的流程被重复使用了。这当然可以解释为什么这一过程似乎仍然是开放的。我要重写这一节。谢谢