代码之家  ›  专栏  ›  技术社区  ›  Mike Blandford

用于测量高度的Silverlight后台线程

  •  1
  • Mike Blandford  · 技术社区  · 15 年前
    Thread MeasureThread = new Thread(delegate()
    {
      TextBlock tb = new TextBlock();
    });
    MeasureThread.Start();
    

    这会引发一个无效的跨线程访问异常,即使这个特定的文本块永远不会添加到可视化树中。我意识到我可以用dispatcher.begininvoke包装它,但这似乎不能解决使用后台线程的问题。我想用这个文本框来计算一些文本的高度,对于1000多种不同的文本。我希望能够在后台线程中进行这种计算。

    1 回复  |  直到 15 年前
        1
  •  1
  •   KeithMahoney    15 年前

    不幸的是你不能这么做。对uielements的所有更改都必须发生在ui线程上,而不管任何特定元素是否实际存在于可视化树中。

    我假定您不希望将此逻辑放在UI线程上的原因是,它会导致UI在计算完成时锁定。解决此问题的一种方法是按照您的建议执行;使用Dispatcher.BeginInvoke。您可以调用单个文本块的计算,而不只是调用1000多个文本块的计算,然后在完成后调用下一个文本块,以此类推。您还可以使用DispatcherTimer来安排事件发生的时间。这样,您就可以拆分单个大型计算,从而使UI永远不会完全冻结;当然,完成计算需要更长的时间,但这样做时不会长时间锁定UI线程。