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