co_await表达式需要合适的“ await_ready”函数,但未找到任何函数

时间:2019-04-15 03:04:59

标签: uwp coroutine c++-winrt

对于C = / WinRT UWP应用,以下代码会产生错误“此co_await表达式需要合适的“ await_ready”函数,但未找到”。

auto a = co_await Windows::Devices::Enumeration::DeviceInformation::FindAllAsync(Windows::Media::Devices::MediaDevice::GetAudioCaptureSelector());

我是协程的新手,不确定什么是错误的。 Visual Studio项目确实具有/ await命令行选项。

2 个答案:

答案 0 :(得分:2)

从C ++ / WinRT 2.0开始,您需要包括winrt/coroutine.h以获得所有C ++ / WinRT的协程支持,并需要包含winrt / Windows.Foundation.Collections.h。 也要坚持使用@Chuck Walbourn提到的C ++ / WinRT投影类型(它们以winrt ::开头)。

这是我的摘录:

// pch.h
...
#include <winrt/coroutine.h>
#include <winrt/Windows.Foundation.Collections.h>
#include <winrt/Windows.Devices.Enumeration.h>
#include <winrt/Windows.Media.Devices.h>
...

// MainPage.h
...
winrt::Windows::Foundation::IAsyncAction OnNavigatedTo(Windows::UI::Xaml::Navigation::NavigationEventArgs const&);
...

// MainPage.cpp
winrt::Windows::Foundation::IAsyncAction MainPage::OnNavigatedTo(Windows::UI::Xaml::Navigation::NavigationEventArgs const& e)
{
    auto collection{ co_await winrt::Windows::Devices::Enumeration::DeviceInformation::FindAllAsync(winrt::Windows::Media::Devices::MediaDevice::GetAudioCaptureSelector()) };

    for (auto const& deviceInformation : collection)
    {
        OutputDebugString((deviceInformation.Name() + L"\n").c_str());
    }
}

答案 1 :(得分:0)

当您将co_await表达式放在本身不是协程的函数中时,将生成此IntelliSense诊断:

void foo() {
    auto a = co_await DeviceInformation::FindAllAsync(MediaDevice::GetAudioCaptureSelector());
}

问题不在于co_await表达式本身;它是void返回类型的结果。要解决此问题,您必须为要用作协程的函数提供合适的返回值,例如:

IAsyncAction foo() {
    auto a = co_await DeviceInformation::FindAllAsync(MediaDevice::GetAudioCaptureSelector());
}