2010-12-11 74 views
2

Je voudrais créer un nouveau processus qui nettoie après lui-même, même si le processus appelant s'est terminé. J'ai mocké un exemple ci-dessous, en utilisant le bloc-notes pour afficher un fichier temporaire, que je voudrais être supprimé après la fermeture du bloc-notes.Est-il possible de créer un processus qui nettoiera toujours après lui-même?

Dans le code ci-dessous, cela fonctionne comme prévu si je décommenter la ligne WaitForExit() ou alternativement aller dans une boucle infinie pour imiter le programme appelant en cours d'exécution. Le problème principal est lorsque le programme appelant se termine, car l'événement n'est plus géré.

J'apprécierais toutes les suggestions sur la façon de gérer ce cas.

Cordialement,

Chris

static void Main(string[] args) 
    { 
     string filename = @"c:\temp\example.txt"; 
     if (!File.Exists(filename)) 
      File.WriteAllText(filename, "abc"); 

     ProcessStartInfo psi = new ProcessStartInfo("notepad", filename); 

     Process cmdProcess = new Process(); 

     Process p = new Process(); 
     psi.CreateNoWindow = true; 
     p.EnableRaisingEvents = true; 
     p.StartInfo = psi; 
     p.Exited += (sender, e) => { File.Delete(filename); }; 

     p.Start(); 
     //p.WaitForExit(); 
    } 
+0

Je ne comprends pas pourquoi ** ** avez-vous commenter la dernière ligne. Je sais que cela bloque le fil de l'appelant (c'est-à-dire votre programme) mais peut être exactement ce que vous voulez ** –

+0

Je voudrais que le fil de l'appelant (mon programme) continue sa vie après, totalement indépendant du sous-processus . – cristobalito

Répondre

3

Une façon sournoise serait d'écrire un fichier batch qui fait environ ceci:

notepad c:\temp\example.txt 
del c:\temp\example.txt 

puis ont votre processus d'exécuter le lot à la place.

échantillon de travail (sauf comme c: \ test.bat):

echo FOO > c:\test.txt 
notepad c:\test.txt 
del c:\test.txt 
del c:\test.bat 
+0

Merci liho1eye - c'est la solution actuelle, mais il manque une certaine élégance imho :) – cristobalito

+0

Vous pouvez créer un troisième processus de "moniteur" qui fait essentiellement la même chose. Alors votre solution serait purement C#, mais un peu plus de code et de complexité de projet/exécutable supplémentaire. L'essentiel est que quelqu'un doit le faire (effectuer une action de nettoyage) et le bloc-notes ne peut pas le faire, puisque vous n'avez aucun contrôle sur elle. –

+0

Je suis encore un peu déçu de l'aspect haineux de cette réponse, mais j'apprécie que ce soit probablement le meilleur qui puisse être fait compte tenu des circonstances. Merci pour votre suggestion. – cristobalito

2

Si le processus d'appel est sorti il ​​ne peut plus rien faire; ça n'existe pas.

Une option serait de créer un autre thread qui est pas un thread d'arrière-plan (définissez IsBackground à false) et appelez WaitForExit sur ce thread; Cela gardera le processus actif pendant la sortie normale de Main. Cependant, cela ne peut rien faire si le processus se termine anormalement (gestionnaire de tâches tuez, ou simplement en retirant l'alimentation).

+0

Merci Marc - suggestion intéressante que je vais enquêter. Quant à la résiliation anormale, c'est quelque chose que je peux vivre avec. – cristobalito

+0

Problème avec ceci est que le programme appelant ne peut pas terminer jusqu'à ce que le processus qu'il a créé se termine. Y a-t-il un moyen pour le nouveau processus de faire ce nettoyage de son propre chef? – cristobalito

0

Avec des fichiers en particulier, vous pouvez étudier l'utilisation de Win32 FileCreate avec FILE_FLAG_DELETE_ON_CLOSE - http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx Je ne pense pas non plus qu'il existe un support existant dans .Net Framework pour cela.

+0

Merci Alexei - Je voudrais que le processus "parent" crée le fichier et le processus "enfant" pour le supprimer une fois terminé. – cristobalito