작업

2010-11-19 5 views
0

을 실행하는 동안 UI 업데이트 나는 다음과 같은 코드를 가지고 :작업

 progressBar1.Minimum = 0; 
     progressBar1.Maximum = Results.Count; 

     foreach (MyClass cls in Results) 
     {     
       progressBar1.Value += 1; 

       // Go to DB and get large quantity of data 
       cls.GetHistoryData(); 

     } 

내가 뭘하려는 것은 ProgressBar1의가 제대로 업데이트되도록 다른 스레드로 처리를 이동합니다. 진행률 표시 줄에서 Invoke 메서드를 사용할 수 있어야한다는 것을 의미하는 article을 찾았지만 하나가 아닌 것으로 보입니다.

답변

2

당신이 수동으로 스레드 컨텍스트를 전환 할 필요가없는 데이터 속성에 진행 막대를 결합합니다. WPF 바인딩 엔진이 자동으로이 작업을 수행합니다.

<ProgressBar Value={Binding Progress} /> 

다음 스레드 :

foreach (MyClass cls in Results) 
{     
     // databinding will automatically marshal to UI thread 
     this.Progress++; 
     cls.GetHistoryData(); 
} 

대부분의 경우이 Dispatcher.Invoke 또는 BackgroundWorker을 사용하여 자신에 정렬 화보다 훨씬 깨끗하고 덜 오류 경향이

+0

이것은 이상적인 솔루션처럼 보입니다. 불행히도, 그것은 작동하지 않는 것 같습니다. Progress가 클래스 수준 변수로 설정되어야한다고 가정합니다 (그렇지 않으면 인식하지 못합니다).해야 할 일이 있습니까? –

+0

당신의 설정에 달려 있습니다. UserControl/Window에 속성을 추가하고이 게시물과 마찬가지로 바인딩 할 수 있습니다. http://goo.gl/ZMcnp 이상적으로 MVVM을 사용하면 더 쉽게 작업 할 수 있습니다. CurrentProgress 속성을 가진 ProgressDialogViewModel 클래스와 Message 및 Tiltle 속성과 같은 기타 요소에 대한 DataTemplate이 있습니다. DataTemplate에서 이러한 속성에 대해 바인딩합니다. – bitbonk

+0

+1 - 가장 좋은 솔루션입니다. 그러나 "진행"에 대한 종속성 속성을 구현하는 대신 INotifyPropertyChanged를 사용합니다. –

2

BackgroundWorker 클래스를 확인해야합니다. 진행을 지원하고 스레드 간의 통신을 적절하게 처리합니다.

0

당신과 같은 새로운 스레드를 시작합니다 :

Thread t1 = new Thread(methodnametocall); 
    t1.start(); 

void methodnametocall() 
{ 
    this.Invoke((MethodInvoker)delegate 
    { 

     control to update; 
    } 
}); 
0

progressBar1.Minimum = 0; 
progressBar1.Maximum = Results.Count; 

foreach (MyClass cls in Results) 
{ 
    ThreadPool.QueueUserWorkItem((o) => 
      { 
       progressBar1.Dispatcher.BeginInvoke(
        (Action) (() => progressBar1.Value += 1)); 
       cls.GetHistoryData(); 
      }); 
} 
시도
0

당신이 링크하는 기사는 winforms 예제이지만 요 WPF 응용 프로그램을 만들고 있습니다. 귀하의 경우에는 대신 Dispatcher 클래스를 사용하여 컨트롤의 Dispatcher 속성을 살펴 봐야합니다.

관련 문제