2016-04-01 19 views
0

. Özel bir olay ve hiçbir UI iş parçacığından işlenen bir ilerleme nesnesi oluşturuyorum. Özel etkinliğimde sonuç etkinliğini yerleştirdim ve kullanıcı arabirimimin çapraz iş parçacığı güncelleştirmesi hala çalışıyor. Bu hiçbir anlam ifade etmiyor. Etkinlik patlar ve kodunu çalıştırırsa, ilerleme olayı diğer olayda nasıl tetiklenir. Bunun asla yapılmaması gerektiğini biliyorum. Ama neden mantıklı çalıştığını anlayamıyorum.Progress nesnesini özel bir olayla birleştirin ve neden çalıştığından emin değil, ancak bunun neden çalıştığını anlamaya çalışıyorum

private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     pracViewModel myViewModel = new pracViewModel(5, "Hello"); 

     Progress<int> progress = new Progress<int>(); 

     myViewModel.triggerEvent += (i) => 
     { 
      Debug.WriteLine(i.ToString()); 

      progress.ProgressChanged += (o, result) => 
      { 
       txtBlock1.Text = result.ToString(); 

      }; 

     }; 


     myViewModel.countAsync(progress); 
    } 




class pracViewModel 
{ 
    public async void countAsync(Progress<int> progress) 
    { 
     await count(progress); 
    } 

    private Task count(IProgress<int> progress) 
    { 
     return Task.Run(() => 
     { 
      for (int i = 0; i < 100; i++) 
      { 
       Task.Delay(1000).Wait(); 
       progress.Report(i); 
       triggerEvent(i); 
      } 
     }); 
    } 

} 

cevap

2

Progress<T> yapıcı akımı SynchronizationContext yakalar - bu durumda, bir kullanıcı arayüzü bağlamında.

İş parçacığı havuzu iş parçacığınız Report, Progress<T> çağrıları için bu UI içeriğini kullanır, böylece UI iş parçacığı Progress<T>.ProgressChanged'u yükseltir.

+0

Ama başka bir olayda nasıl ateşlenir? Kurulumum temel olarak bir olaydaki bir olaydır. – user3363744

+0

@ user3363744: Hiç de değil. "Yangın olayı", "ProgressChanged" etkinliğine yalnızca tetikleniyor * tetikleniyor. –

+0

anlam ifade ediyor – user3363744