簡體   English   中英

為什么我的應用程序在注銷/關閉(c#/。net winforms)時無法關閉?

[英]Why does my application not close on logoff/shutdown (c#/.net winforms)?

當我注銷/關機時,我的winforms應用程序無法正常關閉。 我有一個主窗體,其Closing事件已正確觸發,但是必須有其他一些使我的應用程序保持存在的狀態。 如果我檢查Application.OpenForms,只有一個主窗體。

棘手的地方是問題所在,可能是我的應用程序使用ShellWindows掛接到Internet Explorer,並在IE事件觸發時偶爾打開表單。 在打開或關閉這些表單中的一個或多個之后,我的應用程序在關機時停止關閉。

我想我正在清理所有表單對象,並適當地調用FinalReleaseComObject(),但是我猜那里有一些引用使我的進程處於打開狀態。 有什么辦法可以解決導致我的應用無法正常關閉的問題?

如果運行的線程尚未設置為后台,則應用程序也將保持打開狀態。 如果要創建自己的任何線程,請確保它們正確終止。

如果對線程的完成不是很關鍵,請將IsBackground設置為true。 您也可以在線程上調用Abort以(某種程度上)強制殺死它。

最可能的原因是,您的應用程序的主窗口關閉時,背景線程一直處於關閉狀態,而該線程沒有被關閉。 根據您的設置和框架版本,后台線程可以在主線程終止時使應用程序保持活動狀態。

在關閉期間,窗口通常通過向進程的主窗口發送WM_QUIT來要求每個正在運行的應用程序終止。 WinForms會很樂意使用此消息來關閉主窗口,但是如果留下任何后台線程,則實際過程可以繼續。

這是一種非常丑陋的方法,但是如果您只想殺死正在運行的線程,則可以使用System.Diagnostics.Process.GetCurrentProcess.Threads使所有線程在應用程序中運行,然后進行枚舉並在它們上調用Thread.Join()或Thread.Abort()。

只需確保不要在正在使用的主(UI)線程(接收Closing事件的線程)上調用.Abort()。 因此,請確保檢查當前線程(System.Threading.Thread)不是您要中止的線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM