2011-04-12 60 views
0

我有一個關於調度程序和後臺工作線程的問題。我有一個系統,我異步處理HTTP請求。最終,ObservableCollection被綁定到WPF控件。調度員和工作線程

我一直在使用Dispatcher.CurrentDispatcher.CheckAccess()來代替Silverlight的Deployment.Current.Dispatcher.CheckAccess()來確定我是否在UI線程中。然而,看看Stack Overflow的文檔和其他問題,似乎WPF版本只是在需要時創建一個調度器。

當前系統在調度線程上使用CheckAccess來確定我們是否在UI線程上,然後將其傳遞給在工作線程中運行的處理程序。工作線程上的CheckAccess也返回true,大概是因爲它只創建了自己的Dispatcher。

移動到跨線程可觀察集合不是一個選項。另一個問題說我需要維護對UI線程調度程序的引用。有什麼方法可以使用線程命名空間中的Dispatcher類/其他類來確定我是否在UI線程中?或者我應該繼續使用調度線程的調度程序來運行處理程序,而不管調度線程是否是UI線程?

謝謝!

回答

2

我一直在使用Dispatcher.CurrentDispatcher

這將只是獲得了調度與調用(當前)線程相關的,如果一個不存在,將會被創建。正如你所發現的那樣,在調度器上調用CheckAccess()將返回true

您可以嘗試使用Application.Current.Dispatcher,我的觀察顯示這是與主UI線程相關的調度程序,儘管我不能肯定地說這是總是的情況。你還需要記住,如果你有多個UI線程,這可能不起作用,你不知道哪個線程擁有綁定到你的ObservableCollection的UI元素。在這種情況下,您需要開始傳遞相應的分派器(或SynchronizationContext)的引用。

+0

我想使用這個,但由於某種原因,我的項目中找不到應用程序類。我添加了對PresentationFramework的引用,但是編譯器仍然告訴我「Application」在命名空間「System.Windows」中不可用。我需要參考另一個程序集嗎?我正在使用C#類庫。 – sohum 2011-04-13 15:49:15