对于C = / WinRT UWP应用,以下代码会产生错误“此co_await表达式需要合适的“ await_ready”函数,但未找到”。
auto a = co_await Windows::Devices::Enumeration::DeviceInformation::FindAllAsync(Windows::Media::Devices::MediaDevice::GetAudioCaptureSelector());
我是协程的新手,不确定什么是错误的。 Visual Studio项目确实具有/ await命令行选项。
答案 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());
}