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