2012-02-22 139 views
1

想象一下,啓動一個進程或啓動一個應用程序,然而在任務管理器中殺死這個進程。是否有事件關聯?殺死進程事件

此代碼,取消用戶關閉窗口申請

private void Form1_Aplicacao_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (e.CloseReason == CloseReason.UserClosing) 
     e.Cancel = false; 
} 

但是,如果我使用process.Kill()方法的FormClosing事件還沒有被解僱。 我的問題:有一個事件來殺死這個自己的過程?

+0

HTTP的可能重複:// stackoverflow.com/questions/3326242/c-sharp-windows-form-killed-by-task-manager-is-there-a-way-to-run-shutdown-fun – arunes 2012-02-22 14:53:38

+0

我不相信你會發現一個事件當應用程序以這種方式突然終止時。 – 2012-02-22 14:53:57

回答

1

簡短回答:不,應用程序無法知道(例如引發了一個事件)它的主機進程已被殘忍地殺死。

3

進程死亡時不會引發事件。最有可能的是,當進程從調度程序的可運行任務列表中刪除時,它的內存被釋放,然後操作系統在之後拾取剩餘的任何部分。我絕對不會依賴運行的析構函數或垃圾收集,所以任何正在使用的操作系統無法清理的資源都將被泄漏。 (實際上)殺死一個過程意味着你殺死它,把它切碎,磨碎,然後把碎片扔進海里。更具體地說,不會跳入殺死進程的代碼,因此在代碼中不會發生事件。請記住,像許多其他流控制構造(循環,條件等)以及多任務本身一樣,事件只是幻想的gotos。非常有用的花式gotos,但仍然簡單地跳轉到可用代碼的不同部分。

0

這不是正確的。 您可以使用過程通信技術,如PIPES。

您可以發送投擲PIPES並等待回答。 您可以創建一個規則,如果在X時間內沒有收到答案,則該過程已被終止。

但這在過程通信選項,以獲取更多信息,您可以通過以下鏈接查詢只有一個:https://msdn.microsoft.com/en-us/library/windows/desktop/aa365574(v=vs.85).aspx

也期待在以下幾個選項: C# process.start, how do I know if the process ended?