Parallel.ForEach在处理大列表时挂起MVVM中的布局

时间:2013-07-18 08:29:02

标签: wpf performance data-binding

我有一个包含近1100个元素的通用List。这些元素中大约有10个每个包含1000个元素(相同类型)。元素绑定到UI DataGrid。判断此列表需要5-6秒(因为我在迭代中操作的属性是数据绑定到DataGrid属性)。

这是迭代代码:

Parallel.ForEach(this.AllParameters, par =>
{
  foreach (Parameter subPar in par.WrappedSubParameters)
  {
    subPar.IsSelected = false;
  }
  par.IsSelected = false;
});

Xaml中的代码片段如下:

  <DataGrid.RowStyle>
     <Style TargetType="{x:Type DataGridRow}" BasedOn="{StaticResource {x:Type DataGridRow}}">
       <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=OneWay}" />

在我的previous question中,我被建议使用并行迭代,但它会挂起UI并且永远不会返回。如何在MVVM中进行迭代之前暂停UI。我是以正确的方式做代码吗?请建议。 感谢

1 个答案:

答案 0 :(得分:2)

你可以在这里找到你的答案:link基本上就是,你不能在UI线程上调用Parallel.ForEach。如果你不确定当前的线程,那么你可以使用这样的方法:

    public static bool CheckIsRunningOnUIThread()
    {
        if (Application.Current == null) return false;
        var dispatcher = Application.Current.Dispatcher;
        if (dispatcher==null) return false;
        return dispatcher.CheckAccess();
    }