1

私は初めて並列プログラミングを実験しています。これを使用して、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();
    }));
 });

次に何が起こるかというと、フィルタから除外された他の予定が表示されることがあります。フィルタされた予定の数が常に正しいことはわかっていますが、画面に正しい予定が常に表示されるとは限りません。何が起こっている ?

4

1 に答える 1

0

通常、メイン スレッドで UI 要素を更新する必要があります。WPF を使用していて、バインドされたプロパティをバックグラウンド スレッドで更新した場合でも、WPF システムはそれを UI にマーシャリングする必要があります。

これは、あなたの場合、「作業」が UI とバインドされたプロパティを完全に更新しているため、UI スレッドで直接実行する方がよいことを意味します。このParallel.ForEach場合、 は操作全体の安定性を低下させ、速度を低下させる可能性があります。

于 2013-10-03T16:34:35.553 に答える