2015-06-11 32 views
2

我知道這個問題已被問及甚至更好回答,但我嘗試了我在網上找到的所有內容,並且我的winform應用程序仍在使用RAM的任務管理器中的進程列表中。我的應用程序在退出後繼續在進程中運行

我使用Quartz.NET,這是我如何關閉我的應用程序:

private void Form1_FormClosed(object sender, FormClosedEventArgs e) 
    { 
     scheduler.Shutdown(); 
     scheduler2.Shutdown(); 
     Application.Exit(); 
    } 

我使用兩個調度。我試圖殺死我的應用程序內的進程,我用FormClosing,但它仍然存在。

編輯:事實證明Form1_FormClosed沒有被調用,我不得不通過表單屬性添加它。

+0

這可能聽起來很愚蠢,但你等了10秒?這是應用程序在關閉所有調度程序都停止之前等待的默認時間間隔。 – Chavez

+0

我已經等了10多分鐘,還在跑步。我注意到的一件事是,只要我按下退出,任務管理器名稱左側的箭頭消失。 – Ctrlfreak

回答

5

最可能的原因是:另一個線程(UI線程除外)仍在運行,並阻止進程終止。您可以強制應用程序使用

Environment.Exit(0); 

因爲Application.Exit();「嘗試」正常退出應用程序在FormClosed事件終止進程,而是一個在Environment類迫使其立即終止。

+0

這不是也突然殺死所有線程嗎?這意味着如果一個線程函數有一些優雅的退出代碼,它不會被調用。 – Codecat

+0

@AngeloGeels這種情況下的開發人員對此負責。如果他的線程仍在運行,他或者想阻止用戶退出,或者強制應用程序退出。但保持其運行流程是完全沒有意義的 –

+0

我用它仍然沒有。 – Ctrlfreak

0

必須有一個仍在運行的線程。您可以使用Thread.IsBackground Property將所有線程設置爲後臺線程。當主線程結束時,您將確定所有線程都已結束

在這種情況下調用Environment.Exit(0);是不好的做法。我會嘗試調查哪個線程沒有結束,關閉後發生了什麼

+0

如何查看正在運行的線程? – Ctrlfreak

+0

我在說你創建的線程。你應該知道什麼時候。儘量讓他們都背景,看看是否還有問題。你也可以把簡單的控制檯登錄到主線程功能中。如果您使用的是第三方庫 - 請確保正確關閉它們 – voytek

相關問題