2014-02-13 80 views
1

我想獲取WPF應用程序中的當前調度程序。我想要調度程序的代碼位於.cs類文件(常規C#類)中。 Application.Current.Dispatcher.Invoke()和其他....Current.Dispatcher.Invoke()不可用。如何在WPF應用程序的任何地方獲取調度程序

有沒有辦法做到這一點?

+3

聽起來像你正試圖讓業務類調用到你的UI線程。這總是會有問題。 – Gusdor

+0

@Gusdor:如果這是設計,可以讓業務對象調用GUI。緩慢的任務應該在不同的線程上完成以保持響應;如果這些類是在不同的程序集中定義的,那很好,只需將presentationframework添加到引用。也調用BeginInvoke,因爲您的線程在繼續之前不必等待呼叫完成。 – Dean

+0

@Dean感謝您的建議,但我恭敬地不同意。如果業務代碼絕對需要序列化到UI線程或任何執行隊列,我會讓它知道'SynchronizationContext'的一個實例。業務對象永遠不應該意識到UI框架。你將如何單元測試沒有'Application'初始化的代碼?如果您想在桌面應用程序中使用該程序集並且需要Web服務,該怎麼辦?因爲你沒有學會使用TPL,所以你會在重構中屈膝。 – Gusdor

回答

3

爲什麼類Application.Current.Dispatcher不可用?你有沒有引用到PresentationFramework程序集?

0

您可以從窗口或當前窗口得到調度..

Application.Current.MainWindow.Dispatcher.Invoke() 
0

我覺得System.Windows.Threading.Dispatcher.CurrentDispatcher應該做的工作,但你應該知道,調度你會接收取決於您從中調用此方法的線程。在這裏你可以看到非常好的解釋,兩者之間的確切區別是什麼 - Dispatcher.CurrentDispatcher vs. Application.Current.Dispatcher

我的直覺告訴我,Application.Current.Dispatcher永遠不會改變,是全球性的,以當前應用程序的所有線程,而Dispatcher.CurrentDispatcher可能因從調用它的線程上創建調度的新實例。

這就是爲什麼我會建議你找到一種方法,抽象Application.Current.Dispatcher或某些觀點的調度,並通過這種抽象訪問它 - 它只是對多線程的情況下更安全。

相關問題