我在我的項目中使用的可視控件來自我沒有源代碼的庫。
需要花費很長時間才能更新(粗略爲200毫秒),以便在屏幕上同時顯示其中三個控件時具有良好的UI響應能力。 (我可能需要立即更新所有三個,這讓我的用戶界面卡住〜600毫秒,而他們都在想)。在另一個線程中運行WPF控件
我已閱讀了一些關於TaskSchedulers的文章,並開始研究並行任務功能,以此作爲在他們自己的線程中運行這些控件中的每一個的一種方式。該平臺將是多核,所以我想利用相同的處理。
的問題是,我甚至不知道我不知道如何去了解這一點,雖然不..
是否有從一個單獨的線程運行的控制合適的設計模式WPF中的主要UI線程?
具體的:這是一個第三方地圖控制,當給定一個新的位置或縮放級別需要太長時間才能重繪(〜200ms)。有可能三個這些更新在最大4Hz - 顯然他們不會跟上..
我已經封裝WPF控件在一個用戶控件,並需要在它自己的線程中運行每個實例,同時仍然捕獲用戶輸入(例如鼠標點擊)。
UPDATE:雖然我感覺周圍的解決方案,我到目前爲止實施以下。
我的主(UI)線程產生一個線程,該線程創建一個包含正在討論的控件的新窗口,並將其定位在正確的位置(以便它看起來像只是一個正常控件)。
_leftTopThread = new Thread(() =>
{
_topLeftMap = new MapWindow()
{
WindowStartupLocation = WindowStartupLocation.Manual,
Width = leftLocation.Width,
Height = leftLocation.Height,
Left = leftLocation.X,
Top = leftLocation.Y,
CommandQueue = _leftMapCommandQueue,
};
_topLeftMap.Show();
System.Windows.Threading.Dispatcher.Run();
});
_leftTopThread.SetApartmentState(ApartmentState.STA);
_leftTopThread.IsBackground = true;
_leftTopThread.Name = "LeftTop";
_leftTopThread.Start();
凡CommandQueue
是Thread-safe BlockingCollection隊列用於將命令發送到在地圖(移動位置等)。
現在的問題是,我可以任
- 具有用戶輸入由於
System.Windows.Threading.Dispatcher.Run()
呼叫 - 或塊上的CommandQueue,監聽由主線程
我發送的命令無法旋轉等待命令,因爲它會吸收我所有線程的CPU!
是否有可能阻止和使事件消息泵工作?
所有WPF控件必須在UI線程上進行更新。不過,如果您提供您正在使用的控件的某些詳細信息以及您編寫的用於更新/填充它的任何代碼,我們可能會提供幫助。 – 2012-04-10 04:10:27
@CameronPeters,你確定不能有多個「UI線程」? – svick 2012-04-10 20:20:05
我目前有多個'UI'線程正在運行(感謝Threading.Dispatcher.Run()),但無法阻止它們等待信號。 – DefenestrationDay 2012-04-10 22:18:09