2010-11-19 30 views
0

çalışırken UI Güncellenmesi Aşağıdaki kod var:görevi

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

     } 

Ne yapmak istiyorum ProgressBar1 doğru günceller ve böylece başka bir iş parçacığı için işleme kayması olduğunu. İlerleme çubuğunda Invoke yöntemini kullanabilmem gerektiğini ima eden bir article buldum, ancak bir tane görünmüyor.

cevap

2

siz manuel parçacığı içeriği geçiş gerekmez veri özelliği progressbar bağlamak edin. WPF ciltleme motoru bunu sizin için otomatik olarak yapar.

<ProgressBar Value={Binding Progress} /> 

Ve sonra dizisindeki:

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

Çoğu durumda bu Dispatcher.Invoke veya BackgroundWorker kullanarak kendiniz sıralanırken çok daha temiz ve daha az hata eğilimli

+0

Bu ideal çözüm gibi görünüyor. Maalesef işe yaramıyor. İlerleme'nin bir sınıf düzeyi değişken olarak ayarlanması gerekeceği varsayımını yapıyorum (aksi halde tanımıyor), yapmam gereken başka bir şey var mı? –

+0

Bu, kurulumunuza bağlı. UserControl/Window'unuza bir özellik ekleyebilir ve bu yazıya benzer şekilde bağlayabilirsiniz: http://goo.gl/ZMcnp Veya daha da iyisi, MVVM ile giderseniz (çok daha kolay şeyler yapar!) ProgressDialogViewModel sınıfınız için bir CurrentProgress özelliğine sahip bir DataTemplate ve bir Message and Tiltle özelliği gibi şeylerin olması gerekir. DataTemplate'de bu özelliklere karşı bağlanırsınız. – bitbonk

+0

+1 - En iyi çözüm. Ancak "İlerleme" için bir bağımlılık özelliği uygulamak yerine INotifyPropertyChanged kullanırdım. –

2

BackgroundWorker sınıfını kontrol etmelisiniz. İlerlemeyi destekler ve dişler arasındaki iletişimi düzgün bir şekilde yerine getirir.

0

Aşağıdaki gibi yeni bir başlık açın olacaktır:

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

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

     control to update; 
    } 
}); 
0

bu

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

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

Bağladığınız makale bir winforms örneğidir, ancak WPF uygulaması yapıyoruz. Sizin durumunuzda, denetimin Dispatcher özelliğini kullanarak Dispatcher sınıfını kullanmalısınız.