c++ - 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.
这行得通,但我仍然相信有更好的方法。
解决方案
您可以尝试通过将工作项提交到线程池来尝试在单独的线程中工作,这可以在保持响应式 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"));
}
推荐阅读
- powershell - 带有用户名和密码的powershell soaprequest
- powershell - 使用 PowerShell 脚本映射主目录时出错
- html - 如何在 CSS 文件中使用 Flask url_for?
- apache-kafka - kafka.tools.GetOffsetShell 在 Kafka 1.0 上启用 Kerberos 安全性
- angularjs - 使用 ng-if-start 而不是多个 ng-if 时有什么性能提升?
- python - Numpy索引:二维数组中每一行的第一个(变化的)元素数
- python - 如何加入大量数据框
- sql - 将表中的行转换为星期几
- php - Woocommerce 类别限制
- ms-access - 访问 - 连接两位小数时出现错误 3615