2016-01-20 108 views
1

我會先說我在解決多線程問題方面沒有太多的經驗。所以我所讀到的很多有關調試競態條件,死鎖,活鎖等的內容對我來說都是嚴格理論的。主線程終止後進程繼續運行?

我有這個.NET應用程序正在使用動態加載的本機win32 dll。如果dll從未加載,則應用程序終止而不會出現問題。但是,如果dll被加載,那麼當用戶退出應用程序時,UI將消失,但該過程不會終止。

我已經打開項目設置中的本地代碼調試,所以我可以看到所有正在運行的線程。當用戶關閉應用程序窗口時,主線程似乎終止。我知道這一點,因爲如果我在Visual Studio的線程窗口中執行Break All,主線程會被重新歸類爲工作線程,並且沒有可用的調用棧。還有20個其他線程仍處於活動狀態,全部都有調用堆棧。我已經查看了所有這些線程的調用堆棧,沒有任何東西在我身上(沒有提及任何調用堆棧中的dll)。

我可以採取哪些措施來縮小這個問題的原因?是否有任何其他工具可以幫助我們指出問題所在?

回答

1

這意味着你的一些Foreground線程還活着。與後臺線程不同,前臺線程保持進程活着。

您應該使用後臺線程或停止前臺線程才能夠正常退出進程。

當所有線程停止時,Windows應用程序將自動退出。

正如你所說

如果DLL不會裝載應用程序終止沒有 問題

我假設所有正在運行的線程都是非託管線程(而不是由CLR創建)。本地代碼中沒有後臺線程的概念。所有線程都必須終止以終止進程。

您必須找到一種方法來指示所有線程在該庫中退出。看看你是否有暴露的API。

如果你沒有找到任何東西,你有一個「大錘」的方法。即用Environment.Exit來終止這個過程,這個過程幾乎都是一樣的。確保你使用這種方法作爲最後的手段,因爲這可能會破壞進程狀態。

+0

問題庫是在家裏編寫的,但所有線程都是由靜態鏈接到dll的第三方庫創建的。而不是試圖照顧第三方代碼的線程管理,它更容易使用「大錘」。 –