开发者

C# Block code till processes release handle on files

I have a foreach loop that starts a process within a try/catch. In the finally section of my try/catch/finally I am trying to ensure the the process does not have a handle on any files. I have to delete files that were being processed.

Nothing I have tried seems to be working. I continue to get System.IO exceptions. "The file is currently in use by another process."

You can see in the finally I am using the WaitForExit() before returning from this method. The very next method call is one to delete files. Why wo开发者_如何学Pythonuld the process still be open or have a handle on any of these file after this?

Thanks!

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();
 }


There's something seriously wrong here. You're starting a bunch of processes, but only waiting for the last spawned one to exit.

Are you sure you don't want the foreach outside the try block?

If you tell us more about what exactly you're trying to do, we could provide better suggestions.


I think you need to restructure your code. As it stands a failure for any of the processes in the foreach will cause an exit from the loop. Even if everything does succeed then your WaitForExit and Close calls in the finally block will only address the last process from the loop above.

You need to deal with each process and its success and/or failure individually. Create a method that accepts a fileInfo parameter and spawns and waits on each process. Move your loop into the client code that will be calling the suggested method.


Is the process a Console application or a GUI application?

For a GUI application, you will have to do Process.CloseMainWindow.


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 (...)
            {
            }
        }
    }
}
  1. Process.WaitForExit() might throw an exception, so it needs a try/catch of it's own.
  2. If you create the process in the using statement, you don't have to worry about closing it, .NET will dispose of it properly.
  3. It's usually better to not precede local variables with an underscore character. Most people just use that for their fields.
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜