我是第一次尝试并行编程,我正在使用它来提高 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();
}));
});
接下来发生的事情是,我有时可以看到其他约会被过滤器淘汰。我知道过滤的约会数量总是正确的,但并不总是我在屏幕上看到正确的约会。发生了什么事情?
通常,您需要在主线程上更新 UI 元素。 即使您使用的是 WPF 并更新后台线程上的绑定属性,WPF 系统仍必须将其编送回 UI。
这意味着,在您的情况下,由于您的"工作"是完全更新 UI 和绑定属性,因此您最好直接在 UI 线程上执行此操作。 在这种情况下,Parallel.ForEach
可能会使整个操作不太稳定,并且可能更慢。