Silverlight - 是否可以在后台线程上创建UI元素?

时间:2011-08-19 01:01:41

标签: c# multithreading silverlight charts

我正在使用PolyLineSegment和points在Silverlight中构建折线图控件。它的工作方式与预期的一样,但是当需要可视化的数据太多(太多点)时,应用程序会冻结很长时间。由于一个明显的原因,我不能在单独的线程上移动我的代码 - 它直接处理UI元素,所以当我尝试从单独的线程调用它时,它会导致异常(即使UI元素尚未呈现)。 / p>

有没有办法在后台线程上动态创建UI元素,然后将它们传递给要呈现的UI线程?如果没有,那么可能的解决方案是什么?我正在考虑创建一个Bitmap图像而不是实际的控件,但在这种情况下不会有太多的交互性。

3 个答案:

答案 0 :(得分:2)

听起来你需要更快速地渲染你的积分。如果您只有800k样本而且只有800像素显示它们,那么如果您只是将其加载到PolyLineSegment,那么每个像素的计算会浪费1000个点。

我会重新'插值'点(这对于你的大型数据集来说真的是合并的)。您需要确保正确捕获每个像素中函数的动态范围:

  • 计算图表应该有多少像素
  • 确定X方向上每个像素的点数
  • 每一点积分:
    • 构建点的直方图
    • 在图表上的这些点将映射到的X处,从max-> min绘制一条垂直线。这捕获了块中表示的全部范围。

如果您的点/像素接近1,您将需要切换到简单渲染以提供更好的视觉效果。

答案 1 :(得分:2)

为了显示具有“数百万点”的波形(在您的情况下为PCM音频数据),您最好直接写入WritableBitmap。然后,您只有一个渲染对象。

您已经说过计算中没有太多处理。尝试使用单独的UIElements是一个太大的开销(恕我直言)。点显示对于位图来说是微不足道的,并且有很多线绘制算法,针对速度进行了优化,可以进行任何线段。

您可以在背景线程上绘制点,并在处理结束时更新图像的ImageSource以显示它。

答案 2 :(得分:0)

您当然可以在后台线程上进行计算工作,并将完成的结果传递给用户界面

Deployment.Current.Dispatcher.BeginInvoke

讨论了here