我正在使用一个来自某个我没有源代码的库的可视化控件,但更新速度太慢(大约200毫秒),如果同时显示三个这样的控件,则UI响应速度较慢(当它们都在考虑时,我的UI会被卡住大约600毫秒)。
我已经阅读了一些关于TaskSchedulers的帖子,并开始调查Parallel task功能是否可以作为将每个控件在其自己的线程中运行的方法。平台将是多核心,因此我希望利用同时处理的优势。
问题是我甚至不知道该怎么做,也不知道需要注意什么。
有适合在WPF中从主UI线程中分离运行控制的设计模式吗?
具体来说,它是第三方地图控件,当给出新位置或缩放级别时,重绘需要很长时间(约200毫秒)。 最多四个这样的控件以最大4Hz的速率进行更新 - 很明显它们无法跟上... 我已经将WPF控件封装在用户控件中,并需要在其自己的线程中运行每个实例,同时仍然捕捉用户输入(例如鼠标点击)。
更新:当我正在寻找解决方案时,我已经实施了以下内容。我的主(UI)线程产生一个线程,创建一个包含所讨论控件的新窗口,并将它定位到正确的位置(这样它看起来就像是一个普通控件)。
我已经阅读了一些关于TaskSchedulers的帖子,并开始调查Parallel task功能是否可以作为将每个控件在其自己的线程中运行的方法。平台将是多核心,因此我希望利用同时处理的优势。
问题是我甚至不知道该怎么做,也不知道需要注意什么。
有适合在WPF中从主UI线程中分离运行控制的设计模式吗?
具体来说,它是第三方地图控件,当给出新位置或缩放级别时,重绘需要很长时间(约200毫秒)。 最多四个这样的控件以最大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!
有没有可能同时阻塞并让事件消息泵工作?