1

我第一次尝试并行编程,我正在使用它来改进 Telerik Scheduler 控件的速度过滤。

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

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();
    }));
 });

接下来会发生什么,我有时可以看到其他约会被过滤器淘汰。我知道过滤的约会数量总是正确的,但我并不总是在屏幕上看到正确的约会。怎么了 ?

4

1 回答 1

0

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

这意味着,在您的情况下,由于您的“工作”正在完全更新 UI 和绑定属性,因此最好直接在 UI 线程上进行。在这种Parallel.ForEach情况下, 可能会使整个操作不太稳定,也可能会变慢。

于 2013-10-03T16:34:35.553 回答