private async void NGButton_Click(object sender, RoutedEventArgs e) { // UIスレッド以外(Task)からの呼び出しなので例外が出る var d = new DrivedObject(); DataContext = "NGButton: " + await Task.Run(() => d.GetData()); }
private void OKButton_Click(object sender, RoutedEventArgs e) { // UIスレッドからの普通の呼び出しなのでOK var d = new DrivedObject(); DataContext = "OKButton: " + d.GetData(); }
private async void DispatcherButton_Click(object sender, RoutedEventArgs e) { // UIスレッド以外(Task)だがDispatcher経由での呼び出しなのでOK var d = new DrivedObject(); await Task.Run(async() => { /* DispatcherObject.CheckAccess() * 現スレッドが DispatcherObject に紐付けられたスレッドかチェックし、 * UIスレッドでなければ false を返す */ if (!d.CheckAccess()) { await d.Dispatcher.InvokeAsync(() => { // DispatcherObjectからのデータ取得も、DataContextの書き替えも両方OK DataContext = "DispatcherButton: " + d.GetData(); }); } }); }