2010-11-19 19 views
3

J'ai une boucle foreach qui démarre un processus dans un try/catch. Dans la section enfin de mon try/catch/finally j'essaye de m'assurer que le processus n'a aucun contrôle sur les fichiers. Je dois supprimer les fichiers en cours de traitement.C# Bloquer le code jusqu'à ce que les processus libèrent le handle sur les fichiers

Rien que j'ai essayé semble fonctionner. Je continue à obtenir des exceptions System.IO. "Le fichier est actuellement utilisé par un autre processus."

Vous pouvez voir dans le j'utilise finalement le WaitForExit() avant de retourner de cette méthode. L'appel de méthode suivant est un pour supprimer des fichiers. Pourquoi le processus serait-il encore ouvert ou aurait un contrôle sur l'un de ces fichiers après cela?

Merci!

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

Répondre

2

Je pense que vous devez restructurer votre code. En l'état, un échec de l'un des processus dans foreach provoquera une sortie de la boucle. Même si tout réussit, alors vos appels WaitForExit et Close dans le bloc finally ne traiteront que le dernier processus de la boucle ci-dessus.

Vous devez traiter chaque processus et son succès et/ou échec individuellement. Créez une méthode qui accepte un paramètre fileInfo et génère et attend sur chaque processus. Déplacez votre boucle dans le code client qui appellera la méthode suggérée.

+0

Merci pour la suggestion. – Nick

0

Le processus est-il une application console ou une application GUI?

Pour une application graphique, vous devez effectuer Process.CloseMainWindow.

3

Il y a quelque chose de grave ici. Vous commencez un tas de processus, mais seulement attendre le dernier a engendré un pour quitter.

Etes-vous sûr de ne pas vouloir le foreach en dehors du bloc try?

Si vous nous en dire plus sur ce que vous essayez exactement de faire, nous pourrions fournir de meilleures suggestions.

+0

C'est certainement un problème. J'ai mal compris le début(). J'avais l'impression que le processus original avait été réutilisé. Cela expliquerait certainement pourquoi le processus semblait rester ouvert. Je vais réécrire cette section. Merci. – Nick

0
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() pourrait jeter une exception, il a besoin d'un try/catch de son propre.
  2. Si vous créez le processus dans l'instruction using, vous n'avez pas à vous soucier de le fermer, .NET le supprimera correctement.
  3. Il est généralement préférable de ne pas précéder les variables locales d'un caractère de soulignement. La plupart des gens l'utilisent simplement pour leurs champs.