2013-02-25 70 views
3

我試圖正常關閉我的應用程序。我的應用程序使用數據綁定,訪問數據庫幾次,並可能有一些先天的威脅運行。使用數據綁定和線程關閉WPF應用程序

由於Application.Current.Shutdown()沒有關閉在這種情況下的一切,我看着Application.Current.Dispatcher.BeginInvokeShutdown()

BeginInvokeShutdown()需要一個System.Windows.Threading.DispatcherPriority參數。這可以是:

  • Invalid - 枚舉值是-1。這是一個無效的優先事項。
  • Inactive - 枚舉值爲0.不處理操作。
  • SystemIdle - 枚舉值爲1.當系統空閒時處理操作。
  • ApplicationIdle - 枚舉值爲2.操作在應用程序空閒時處理。
  • ContextIdle - 枚舉值爲3.在後臺操作完成後處理操作。
  • Background - 枚舉值爲4.在所有其他非空閒操作完成後處理操作。
  • Input - 枚舉值爲5.操作按照與輸入相同的優先級進行處理。
  • Loaded - 枚舉值爲6.操作在佈局和渲染完成時處理,但在處理輸入優先級的項目之前處理。具體來說,這在提升Loaded事件時使用。
  • Render - 枚舉值爲7.以與渲染相同的優先級處理的操作。
  • DataBind - 枚舉值爲8.操作的處理優先級與數據綁定相同。
  • Normal - 枚舉值是9.操作按正常優先級處理。這是典型的應用優先級。
  • Send - 枚舉值爲10.在其他異步操作之前處理操作。這是最高優先級。

現在,假設我的應用程序只在出現問題時才關閉。這意味着應用程序無需完成任何操作,只需要進行原始關閉,以便用戶可以重新啓動應用程序。我是否正確地說我必須給Inactive作爲參數?如果我將Send作爲參數,是否屬實,在完全關閉之前一切都已完成?

回答

1

Application.Current.Shutdown()只要你的線程是後臺線程就應該在你的情況下工作。他們是如何創建的?如果你只是新建一個Thread對象,你應該可以將IsBackground屬性設置爲true。如果他們需要成爲前臺線程,則在關閉時需要手動停止循環。

至於從我的理解BeginInvokeShutdown仍然會處理UI線程隊列中的所有內容,但不會接受任何更多操作。優先級似乎與普通線程優先級設置類似,因爲它與CPU使用率有關,並具有將被調用任務結束到處理隊列前端的額外功能。

+0

因此,當我想關閉我的應用程序和它的所有線程時,我必須手動將每個屬性設置爲'isBackground'?沒有其他辦法了? – Joetjah 2013-02-27 10:17:51

+0

您不能將現有的線程作爲後臺線程。它必須在啓動之前設置。你現在怎麼創建你的線程?如果您使用線程池方法,則可以將它們全部默認爲後臺線程。如果他們長時間運行(這可能是保持應用程序活躍的更可能的原因),那麼我們大概有多少人在談論? – JRoughan 2013-02-27 22:20:47

+0

我在很多地方都有線程運行,我在通過整個解決方案進行搜索時會注意到。我將不得不將它們全部改寫爲Backgroudn線程。這將如何影響我的表現?我認爲我的問題儘可能回答,謝謝。 – Joetjah 2013-02-28 08:35:35