我在我的项目中使用了一个视觉控件,它来自一个我没有源代码的库。
一次在屏幕上使用其中三个控件来更新(大约 200 毫秒)以获得良好的 UI 响应需要太长时间。(我可能需要一次更新所有三个,这让我的 UI 在他们都在思考的时候卡住了大约 600 毫秒)。
我已经阅读了一些关于 TaskScheduler 的帖子,并开始研究并行任务功能,作为在它们自己的线程中运行这些控件中的每一个的一种方式。该平台将是多核的,所以我想利用同步处理。
问题是我什至不知道我不知道该怎么做,虽然..
是否有合适的设计模式可以在与 WPF 中的主 UI 线程不同的线程中运行控件?
具体来说:它是一个第三方地图控件,当给定一个新的位置或缩放级别时,重绘需要很长时间(~200ms)。也许其中三个更新频率最高为 4Hz - 显然它们不会跟上..
我已经将 WPF 控件封装在一个用户控件中,并且需要在它自己的线程中运行每个实例,同时仍然捕获用户输入(鼠标点击, 例如)。
更新:虽然我正在寻找解决方案,但到目前为止我已经实现了以下内容。
我的主 (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
的线程安全 BlockingCollection队列在哪里。
现在的问题是我可以
- 由于
System.Windows.Threading.Dispatcher.Run()
通话而有用户输入 - 或者阻塞CommandQueue,监听主线程发送的命令
我无法等待命令,因为它会占用我所有的线程 CPU!
是否可以阻止并让事件消息泵工作?