2014-01-22 65 views
2

我有一個Windows窗體應用程序,在關閉主窗體後,進程不會退出。主窗體關閉後,應用程序進程不退出 - 使用ApplicationContext

我使用了一個ApplicationContext,因爲我有一個演示者來生成我的主表單。

Application.Run(new ApplicationContext(Instance.InitPresentationManager()));

我有方法DestroyHandle和OnHandleDestroyed重寫進行調試。 在那裏我可以看到DestroyHandle被調用,但OnHandleDestroyed不是! 這就是爲什麼我的進程仍然運行的原因,因爲ApplicationContext在內部註冊到HandleDestroyed事件。

在DestroyHandle方法中,HandleCreated屬性甚至從true更改爲false。 我甚至重寫了WndProc,並且可以看到沒有收到消息「2」(這個調用了Control類中的WmDestroy並觸發了OnHandleDestroyed事件)。

這怎麼可能?

備註:

  • OnHandleDestroy只調用在剛開始的時候RecreatingHandle是真的
  • 當連接到過程,並打破所有線程,主線程仍然在Application.Run方法
  • 我甚至附加了一個內存分析器,它告訴我沒有我的主表單的實時實例
  • Application.Exit在Dispose中主窗體工作並處理症狀,但不處理問題本身
  • 計算機重新啓動後能正常工作一段時間,但最終再次
  • 出現問題的Win 7 64位,VS 2010,.NET 4.0

回答

0

問題是一個封閉的形式,並不一定意味着應用程序應該終止它當前正在做的事情。 (認爲​​寫日誌文件,整齊地關閉通信流等)。

一個線程有一個屬性IsBackground(參見http://msdn.microsoft.com/en-us/library/system.threading.thread.isbackground(v=vs.110).aspx),它有效地表示它是否被允許在中間操作中被殺死。檢查任何正在進行的線程以確保它們正在使用適當的後臺線程標記運行。

嘗試應用程序上下文中的dispose方法。這是一個完全可以接受的模式,並說我已經完成了這個,去掉它,讓長時間運行的線程完成。

+0

通過使用Application.Run這一定意味着當窗體關閉時,應用程序必須退出,請參閱MSDN:http://msdn.microsoft.com/en-us/library/ms157902%28v=vs.100% 29.aspx – toATwork

+0

終止!=退出。終止是「停止你現在正在做的事情」。退出是「完成後,你完成」 –

+0

這是我提到我的問題。主線程仍在運行。因此該應用程序不會退出。更糟的是,似乎MSDN文檔中有一個錯誤,他們聲明Application.Run正在等待表單關閉事件。我檢查了他們正在等待句柄銷燬事件的來源 - 這在我的案例中並未解僱。 – toATwork

相關問題