我试图在C ++ / WinRT中编写一个基于协程的后台线程,该线程在取消令牌的状态上循环,因为我需要对取消采取一些清除措施。
我正在尝试遵循MSDN(https://docs.microsoft.com/en-us/windows/uwp/cpp-and-winrt-apis/concurrency#canceling-an-asychronous-operation-and-cancellation-callbacks)上的文档,但是示例代码的改编版无法编译,并且cancel_token_t类型似乎不可调用。
void BackgroundThreadManager::Start()
{
this->m_Thread = this->RunAsync();
}
void BackgroundThreadManager::Stop()
{
if (this->m_Thread)
{
m_Thread.Cancel();
m_Thread = nullptr;
}
}
IAsyncAction BackgroundThreadManager::RunAsync()
{
winrt::resume_background();
auto token{ winrt::get_cancellation_token() };
while (!token())
{
co_await this->DoSomethingAsync();
}
co_await this->DoSomeCleanupAsync();
}
不幸的是,这无法编译,并引用“ while(!token())”行出现“错误C2064:term的结果不等于带有0个参数的函数”。
代码与此一致,因为get_cancellation_token_t的定义(在base.h中)是
struct get_cancellation_token_t {};
我猜我从根本上做错了,或者MSDN文档已过时。有什么线索吗?谢谢!
答案 0 :(得分:1)
您忘记在co_await
表达式上使用get_cancellation_token()
。 co_await
提供了库需要获取并获得可能被取消的IAsyncAction
实例的钩子。顺便说一句,您还忘记了co_await
表达式。
此外,请注意协程也会在挂起点(resume_background()
)处自动取消,因此最好使用取消回调来确保您的取消逻辑不被忽略。