有沒有人需要處理嘗試殺死Windows Mobile 5設備上的應用?殺死不會殺死進程
這是一個.NET 3.5 WinForms應用程序有許多後臺線程似乎不被清理正確時拋出一個異常。我想,哪一個是殺人案發生的情況。因此,在這兩種情況下,該過程都會顯示一些3個後臺線程,並且在沒有重置的情況下它不會消失。
有什麼辦法來消除其他這樣的過程比實際代碼中修正錯誤?
有沒有人需要處理嘗試殺死Windows Mobile 5設備上的應用?殺死不會殺死進程
這是一個.NET 3.5 WinForms應用程序有許多後臺線程似乎不被清理正確時拋出一個異常。我想,哪一個是殺人案發生的情況。因此,在這兩種情況下,該過程都會顯示一些3個後臺線程,並且在沒有重置的情況下它不會消失。
有什麼辦法來消除其他這樣的過程比實際代碼中修正錯誤?
您需要了解線程如何,至少在CE(以及可能的桌面)的工作。通常,當進程的主(入口)線程退出時,OS調度程序會被通知,並且所有的工作線程都會被安排終止。下一次這些線程要求量子(一段處理時間)時,它們被殺死 - 這是重要的一點。
如果背景線程處於阻塞操作系統調用「卡住」(例如WaitForSingleObject(INFINITE)
),那麼該線程將永遠不會從調度請求量子。如果從來沒有要求調度器有時間來運行線程,則線程永遠不會有機會實際終止。
這是工作線程應該總是總是在其活動循環中有一個超時的主要原因(我認爲如果您在任何地方使用無限超時,則可能是錯誤的)。即使超時返回並再次等待,它也使調度程序有機會終止線程。
你可以嘗試使用TOOLHELP API來終止該進程(IIRC將暫停和恢復工作線程,給調度機會做它的工作)。我不確定它會工作,但P/Invoke很容易嘗試。
您的應用程序是否跟蹤它正在使用的後臺線程?我知道在一個Windows窗體應用程序中,拋出一個異常並殺死主應用程序線程可以讓後臺線程運行,即使你終止了應用程序。如果應用程序正在跟蹤,則可以在應用程序崩潰之前顯式終止後臺線程作爲異常處理的一部分。
否則,您可以定期檢查在後臺線程來看看主應用程序仍在運行,如果不是的話,讓他們自殺。不是很乾淨,但另一種可能性。
正如我在我的問題中提到的,它很可能不會被清理乾淨。我只是想知道是否有辦法殺死這樣的應用程序,無論如何。這不是我的應用程序,我正在尋找一個簡單的方法:) – 2012-03-03 05:05:23
感謝您的寶貴信息。儘管我最終必須清理那個應用程序,但我會嘗試使用toolhelp API路線。 – 2012-03-03 21:30:05