【问题标题】:How to resolve assert WINRT_ASSERT(!is_sta()) in winrt::impl::blocking_suspend如何在 winrt::impl::blocking_suspend 中解决断言 WINRT_ASSERT(!is_sta())
【发布时间】:2019-01-24 18:44:11
【问题描述】:

我有一个 Win32 DLL,我正在尝试将其转换为可从 UWP 使用。我需要将文件处理代码(CreateFile、ReadFile 等)替换为 WinRT 安全等效项(Windows::Storage::StorageFile)。我已经转换和编译了代码,但是当我运行应用程序时,我在返回的异步操作上调用 get 这个异常,我不知道如何解决这个问题。

【问题讨论】:

标签: c++-winrt


【解决方案1】:

好的,花了一点时间弄清楚我做错了什么,但在我的情况下处理这个问题的正确方法是将我的代码包装在一个 co_routine 中,然后使用 PPL 调用它。

IAsyncOperation<int> DoWork()
{
    co_await winrt::resume_background();
    …
    return someValue;
}

int Foo()
{
   return create_task([]{
       return DoWork().get();
   }).get();
}

【讨论】:

  • 虽然这会使 C++/WinRT 诊断静音,但它仍然会出现诊断警告您的相同问题:在 GUI 线程上同步等待。一般来说,这不是你应该做的事情。它可能会解决您当前的问题,但很难说您的问题是什么,因为您的问题仍然相当不完整。
  • 对,断言是提醒不要阻塞UI线程。例如,您可以从 UI 线程调用 DoWork 协程,但您不能在 UI 线程上阻塞并等待其完成。您可以改为使用协程本身来等待完成。
  • 我在尝试获取蓝牙适配器时遇到了同样的问题。也在一个dll中。有没有办法在不阻塞的情况下访问默认的蓝牙适配器?也许在回调中?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
相关资源
最近更新 更多