首页 > 解决方案 > UWP C++/WinRT:异步睡眠

问题描述

如何在不阻塞 UI 线程的情况下等待特定的时间?我正在寻找await Task.Delay()C++/WinRT 中的等价物。

IAsyncAction MainPage::ClickHandler(IInspectable const&, RoutedEventArgs const&)
{
   const auto& requestResponse{ co_await HttpClient{}.GetStringAsync(Uri{ L"https://pastebin.com/raw/1j9EAVUW" }) };

   Sleep(1000); // This does block UI and makes UI not responsive.
   await Task.Delay(1000); // This would work in C#, but is not a thing in C++.

   myButton().Content(box_value(requestResponse));
}

编辑:

一种可能的解决方案是调用Sleep(ms)后台线程。

winrt::apartment_context ui_thread; // Capture calling context.
co_await winrt::resume_background();
Sleep(1000);
co_await ui_thread; // Switch back to calling context.

这行得通,但我仍然相信有更好的方法。

标签: c++asynchronousuwpwindows-runtimewinrt-async

解决方案


您可以尝试通过将工作项提交到线程池来尝试在单独的线程中工作,这可以在保持响应式 UI 的同时仍然完成需要大量时间的工作。有关如何将工作项提交到线程池的更多信息,请参阅文档。

您可以检查以下内容作为示例:

IAsyncAction MainPage::ClickHandler(IInspectable const&, RoutedEventArgs const&)
{
    co_await Windows::System::Threading::ThreadPool::RunAsync([&](Windows::Foundation::IAsyncAction const& workItem)
    {
        Sleep(1000);
    });
    myButton().Content(box_value(L"Clicked"));
}

推荐阅读