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

Wpf Parallel.ForEach在处理大列表时挂起MVVM中的布局,wpf,performance,data-binding,Wpf,Performance,Data Binding,我有一个包含将近1100个元素的通用列表。这些元素中几乎有10个包含1000个元素(类型相同)。这些元素绑定到UI DataGrid。设置此列表需要5-6秒的时间(因为我在迭代中操作的属性是数据绑定到DataGrid属性的) 以下是迭代代码: Parallel.ForEach(this.AllParameters, par => { foreach (Parameter subPar in par.WrappedSubParameters) { subPar.IsSelec

我有一个包含将近1100个元素的通用列表。这些元素中几乎有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}" />

在我的示例中,有人建议我使用并行迭代,但它会挂起UI,并且永远不会返回。在MVVM中进行迭代之前,如何挂起UI。我用正确的方法编写代码了吗?请提出建议。
谢谢

您可以在这里找到答案:基本上,您不能在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();
    }