.net 如何使用Parallel.ForEach正确更新UI(telerik调度程序)

.net 如何使用Parallel.ForEach正确更新UI(telerik调度程序),.net,parallel-processing,telerik-scheduler,.net,Parallel Processing,Telerik Scheduler,我第一次尝试并行编程,并用它改进Telerik调度程序控件的速度过滤 这是我用来按房间筛选约会的代码,例如: Task.Factory.StartNew(() => { SchedulerView view = this.radScheduler1.ActiveView; //ConcurrentBag<Classes.Appointment> _bag; if (InvokeRequired) Invoke((Action)(delegate

我第一次尝试并行编程,并用它改进Telerik调度程序控件的速度过滤

这是我用来按房间筛选约会的代码,例如:

Task.Factory.StartNew(() =>
{
    SchedulerView view = this.radScheduler1.ActiveView;
    //ConcurrentBag<Classes.Appointment> _bag;

    if (InvokeRequired) Invoke((Action)(delegate
    {
        this.radScheduler1.Appointments.BeginUpdate();

        _itemsview = appointments.AsEnumerable().Where(app => app.Start >= view.StartDate && app.End < view.EndDate.AddDays(1)).ToList();

        //_bag = new ConcurrentBag<Classes.Appointment>(_itemsview);    
        Parallel.ForEach(_itemsview, item =>
        {
            if (_unidades.Contains(item.Room.ToString()))
            {
                 item.Visivel = true;
            }
            else
            {
                 item.Visivel = false;
            }
        });

        this.radScheduler1.Appointments.EndUpdate();
        this.radScheduler1.Select();
    }));
 });
Task.Factory.StartNew(()=>
{
SchedulerView视图=this.radScheduler1.ActiveView;
//并行包;
if(invokererequired)Invoke((操作)(委托
{
this.radScheduler1.appoints.BeginUpdate();
_itemsview=appointments.AsEnumerable()。其中(app=>app.Start>=view.StartDate&&app.End
{
if(_unidades.Contains(item.Room.ToString()))
{
item.Visivel=true;
}
其他的
{
item.Visivel=false;
}
});
this.radScheduler1.appoints.EndUpdate();
this.radScheduler1.Select();
}));
});

接下来发生的事情是,我有时会看到其他的约会被过滤掉。我知道筛选的约会数量总是正确的,但我并不总是在屏幕上看到正确的约会。发生了什么?

通常,您需要更新主线程上的UI元素。即使您正在使用WPF并在后台线程上更新绑定属性,WPF系统仍然必须将其重新打包到UI


这意味着,在您的情况下,由于您的“工作”是完全更新UI和绑定属性,您最好直接在UI线程上进行更新。在这种情况下,
Parallel.ForEach
可能会降低整个操作的稳定性,也可能会降低速度。

降低稳定性可能是正确的,但不会比以前慢。我在主线程中更新UI,这就是我在“if(invokererequired)Invoke((Action)(delegate)”中进行更新时发生的情况,对吗?@NoeRocha现在,您正在创建一个后台线程,然后立即编组回UI线程(Invoke),然后在UI线程上工作,然后使用Parallel.ForEach在后台线程上工作,但无论如何,这些工作都是需要在UI线程上进行的工作…@NoeRocha整个过程会更快(并且工作正常)如果您直接编写代码并执行Task/Invoke/Parallel调用,如果它需要这样做,那么它将是这样的……我只是目睹了速度的如此提高,并对放弃这种速度感到有点难过。无论如何,您还有什么我可以改进的吗?它的“列表”和它的自定义类的“绑定列表”(绑定到调度程序控件)