C++/WinRT 在 main() 中使用 co_await

C++/WinRT using co_await in main()

Windows Console Application (C++/WinRT) 项目中,入口点就是标准的 int main() 函数。

那我如何开始使用异步代码?

比如我要调用一个方法

winrt::Windows::Foundation::IAsyncAction WriteToFileAsync()
{
    // calls FileIO::WriteTextAsync etc
}

来自 main.


co_await不能用,即

int main()
{
    winrt::init_apartment();
    
    co_await ::WriteToFileAsync();
}

产生错误

function "main" cannot be a coroutine


我应该使用

int main()
{
    winrt::init_apartment();
    
    ::WriteToFileAsync().get();
}

代替?

一般有没有更好的方法?

根据 C++ 标准的规定,main() 函数不能是 coroutine。如果函数使用 co_await 运算符或 co_yieldco_return 关键字,则它是协程。

因此,您将不得不等待从 main() 函数调用的任何协程 运行 完成。 C++/WinRT 为 IAsyncAction(和系列)提供了扩展函数 get()wait_for()

我不知道有什么“更好”,虽然我也不明白为什么调用 get() 很糟糕。