2010-12-11 31 views
2

我想創建一個新的進程,即使調用進程已終止,它也會自行清理。我在下面嘲笑了一個例子,用記事本來顯示一個臨時文件,在記事本關閉後我想刪除它。是否有可能創建一個始終自行清理的進程?

在下面的代碼中,如果我取消註釋WaitForExit()行或者進入無限循環模仿正在運行的調用程序,則按預期工作。主要問題是調用程序何時結束,因爲事件不再處理。

我很感激任何關於如何處理這種情況的建議。

問候,

克里斯

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

我不明白爲什麼** **你評論的最後一行。我知道它阻止了調用者線程(即你的程序),但這可能正是你想要的** ** – 2010-12-11 19:58:52

+0

我希望調用者線程(我的程序)繼續它的生活之後,完全獨立於子進程。 – cristobalito 2010-12-11 20:05:46

回答

3

偷偷摸摸地將寫一個批處理文件,它大約做到這一點:

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

,然後讓你的程序執行批處理來代替。

工作示例(保存爲C:\ test.bat的):

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

謝謝liho1eye - 這是目前的解決方案,但它缺少一定的優雅imho :) – cristobalito 2010-12-11 20:07:04

+0

您可以創建第三個「顯示器」過程,做基本上相同的事情。那麼你的解決方案將純粹是C#,但更多的代碼和額外的項目/可執行文件的複雜性。底線是有人必須這樣做(執行清理操作),記事本無法做到這一點,因爲你無法控制它。 – 2010-12-11 20:16:48

+0

我對這個答案的黑客感到有點失望,但是要感謝這可能是最好的。感謝您的建議。 – cristobalito 2010-12-14 00:07:44

2

如果調用進程已退出它不再做任何事情;它不存在。

一種選擇是創建另一個線程,即而不是後臺線程(將IsBackground設置爲false)並在該線程上調用WaitForExit;這會在正常退出Main的過程中保持進程的活躍狀態。但是,如果進程異常終止(任務管理器關閉,或簡單地拔出電源),則此操作無法執行。

+0

謝謝馬克 - 我會調查一個有趣的建議。至於異常終止,這是我可以忍受的。 – cristobalito 2010-12-11 19:15:05

+0

問題在於調用程序無法完成,直到它創建的進程結束。是否有新方法自行進行清理的方法? – cristobalito 2010-12-11 19:46:41

相關問題