2016-04-01 21 views
0

私はこれがなぜ機能するのか考えようとしています。私は、none UIスレッドから起動されるカスタムイベントとプログレスオブジェクトを作成します。結果イベントを私のカスタムイベントに配置し、UIへのクロススレッド更新がまだ機能しています。これは意味がありません。イベントが発生してコードが実行され、進行イベントは他のイベントでどのように発生しますか。私はこれが決して行われるべきではないことを知っているしかし、なぜそれが動作するのか論理的に把握することはできません。この場合、UIコンテキスト -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>はそのUIコンテキストを使用するため、UIスレッドはProgress<T>.ProgressChangedになります。

+0

しかし、別のイベントではどのように起動しますか?私のセットアップは基本的にイベント内のイベントです – user3363744

+0

@ user3363744:まったくありません。 「火災イベント」は、ProgressChangedイベントにトリガするのではなく、*購読する*イベントです。 –

+0

感謝します – user3363744

関連する問題