2013-10-03 3 views
1

Parallel Programming을 처음으로 실험하고 있습니다. Telerik Scheduler 컨트롤에서 속도 필터링을 개선하기 위해이 프로그램을 사용하고 있습니다.Parallel.ForEach를 사용하여 UI (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(); 
    })); 
}); 

, 내가 필터로 넘어가는 때때로 다른 약속을 볼 수 있다는 것입니다 :

은 전, 나는 방으로 약속을 필터링하는 데 사용하고있는 코드입니다. 필터링 된 약속 수는 항상 맞지만 항상 화면에 올바른 약속이 표시되는 것은 아닙니다. 무슨 일 이니?

답변

0

일반적으로 주 스레드에서 UI 요소를 업데이트해야합니다. WPF를 사용하고 백그라운드 스레드에서 바운드 속성을 업데이트하더라도 WPF 시스템은 UI에 마샬링해야합니다.

이것은 "작업"이 UI 및 바인딩 된 속성을 완전히 업데이트하고 있기 때문에 UI 스레드에서 바로 수행하는 것이 좋습니다. 이 경우 Parallel.ForEach은 전체 작동의 안정성이 떨어지거나 속도가 느려질 수 있습니다.

+0

덜 안정적이지만 아마도 이전보다 느리지는 않습니다. 메인 스레드에서 UI를 업데이트하고 있는데, "if (InvokeRequired) Invoke ((Action) (델리게이트)"안에 업데이트를하면 어떻게됩니까? –

+0

@NoeRocha 지금 당장 백그라운드 스레드를 만들고 있습니다. , UI 스레드 (Invoke)에 즉시 마샬링 한 다음 UI 스레드에서 작업 한 다음 Parallel.ForEach를 사용하여 백그라운드 스레드에서 작업하지만 작업은 UI 스레드에서 발생해야하는 모든 작업입니다. –

+0

@ NoeRocha 코드를 직접 작성하고 작업/호출/병렬 호출을 꺼낸 경우 전체 작업이 더 빨라지고 올바르게 작동합니다. –