2016-04-01 2 views
0

Я пытаюсь выяснить, почему это работает. Я создаю пользовательское событие и объект прогресса, которые запускаются из нити нити пользовательского интерфейса. Я поместил событие результата в мое пользовательское событие, и обновление кросс-потоковой передачи в моем пользовательском интерфейсе все еще работает. Это не имеет никакого смысла. Событие запускает и запускает свой код, как происходит событие прогресса в рамках другого события. Я знаю, это никогда не должно быть сделано. Но я не могу понять, почему это работает.Комбинировал объект Progress с настраиваемым событием и не уверен, почему он работает, но он

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

} 

ответ

2

Progress<T> конструктор захватывает текущий SynchronizationContext - в данном случае, в контексте пользовательского интерфейса.

Когда ваш поток нитей потока вызывает Report, Progress<T> будет использовать этот контекст пользовательского интерфейса, поэтому поток пользовательского интерфейса поднимет Progress<T>.ProgressChanged.

+0

Но как это срабатывает в рамках другого события? Моя настройка в основном является событием в событии – user3363744

+0

@ user3363744: Совсем нет. «Событие пожара» просто * подписывается * на событие «ProgressChanged», а не вызывает его. –

+0

имеет смысл спасибо – user3363744

Смежные вопросы