我在我的项目中使用的可视控件来自我没有源代码的库。
需要花费很长时间才能更新(粗略为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