create_Task():应用程序调用为不同线程

时间:2017-12-07 16:36:19

标签: c++ multithreading uwp

我有一个UWP UI,调用需要一段时间才能执行的本机代码。完成后,UI需要更新。这是我的代码:

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

postOptimation例程包括以下行:

backwordCheckBox->IsChecked = params->backwards;

执行此操作会在标题中显示错误。

如何让postOptimation在UI线程中运行?

由于

4 个答案:

答案 0 :(得分:1)

Sornel的好建议!这是有效的:

postOptimation中的代码:

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

    backwordCheckBox->IsChecked = params->backwards;

}));

答案 1 :(得分:1)

您可以使用.then()的重载task_continuation_context,并将其设置为task_continuation_context::get_current_winrt_context()

使用Dispatcher(其他答案)也可以,但这应该与PPL合作更好。

答案 2 :(得分:0)

使用Dispatcher属性的Invoke方法:backwordCheckBox-> Dispatcher-> Invoke。

因为我用.net做了一些事情,它已经安静了一段时间我不记得如何从lambda创建一个Action,但这就是你如何做到这一点。

答案 3 :(得分:0)

此代码将确保在与“backwordCheckBox”控件关联的UI线程上执行操作:

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