2017-12-07 9 views
1

私は実行に時間がかかるネイティブコードを呼び出すUWP UIを持っています。完了すると、UIを更新する必要があります。これは私のコードです:タイトルにエラーを与えるようcreate_Task():アプリケーションが、別のスレッド用にマーシャリングされたインターフェイスを呼び出しました。

backwordCheckBox->IsChecked = params->backwards; 

がこれを実行:

auto runOpti = create_task([this] { runOptimation(); }); 
runOpti.then([this]{postOptimation(); }); 

postOptimationルーチンはラインを含んでいます。

postOptimationをUIスレッドで実行するにはどうすればよいですか? backwordCheckBox-> Dispatcher->起動:

おかげ

+0

このコードはすでにタスク上で実行されているため、別のコードを作成するためにcreate_taskは必要ありません。デバッガのスタックトレースに注意して、デバッガの状態を確認してください。このようなコードに注意してください。あなたのユーザーは、草が成長するのを見て退屈になり、ソリティアを開始し、最適化が完了しません。 –

答えて

0

は、ディスパッチャプロパティのInvokeメソッドを使用します。

私はネットで何かをしてからしばらく静かで、私はラムダからアクションを作成する方法を思い出しませんが、それはあなたがこれを行う方法です。

0

動作を保証します。このコードは、あなたの「backwordCheckBox」コントロールに関連付けられているUIスレッド上で実行されます:

backwordCheckBox->Dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal, 
    ref new Windows::UI::Core::DispatchedHandler ([this, params] 
{ 
    backwordCheckBox->IsChecked = params->backwards; 
})); 
1

良い提案Sornelから!ここで働いていたものです:

postOptimation内部コード:

Dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::High, 
    ref new Windows::UI::Core::DispatchedHandler([this]() 
{ 

    backwordCheckBox->IsChecked = params->backwards; 

})); 
1

あなたはtask_continuation_contextを取る.then()のオーバーロードを使用し、task_continuation_context::get_current_winrt_context()に設定することができます。

Dispatcher(その他の回答)を使用することもできますが、これはPPLでよりよく構成する必要があります。

関連する問題