まぐらぼ

Unity/Android、Microsoft系のWPFをやってます。

UIスレッドのディスパッチャ

 

C#/WPFだとこんな感じ。

public MainWindow()

{

    InitializeComponent();

}

private void HeavyWork() {

    System.Threading.Thread.Sleep(3000);

}

private void Button_Click(object sender, RoutedEventArgs e)

{

    var dispatcher = this.Dispatcher;

    Action asyncWork = () =>

    {

        HeavyWork();

 

        dispatcher.Invoke(new Action*1;

    };

 

    this.idButton.IsEnabled = false;

    asyncWork.BeginInvoke(null, null);

}

 

 

C++/CX/StoreAppだとこんな感じ。

 

 

void MainPage::saveButton_Click(Object^ sender, RoutedEventArgs^ e)

{

saveButton->IsEnabled = false; //非同期処理中はボタンを無効にする

    //     Task.Delay(TimeSpan.FromSeconds(1));// wait for N seconds.

 // C++/CXでSleepどう描くのかわからん。

 

Dispatcher->RunAsync(CoreDispatcherPriority::Normal, ref new DispatchedHandler([this]()

{

saveButton->IsEnabled = true; //ボタンを有効に戻す

 }));

 }

 

 

C++/CXでSleep()の書き方、わからなかったので、検索したけど、ストアアプリは非同期前提なので面倒くさいのだな。PPLでタスク作って自タスクがまたされる設定にすればよいだろうけど、PPLを忘れてしまった。

 

 

*1:) =>

        {

            this.idButton.IsEnabled = true;

        }