不清楚如何将winrt :: get_cancellation_token用于IAsyncAction

时间:2019-01-13 12:53:36

标签: uwp windows-runtime c++-winrt

我试图在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文档已过时。有什么线索吗?谢谢!

1 个答案:

答案 0 :(得分:1)

您忘记在co_await表达式上使用get_cancellation_token()co_await提供了库需要获取并获得可能被取消的IAsyncAction实例的钩子。顺便说一句,您还忘记了co_await表达式。

此外,请注意协程也会在挂起点(resume_background())处自动取消,因此最好使用取消回调来确保您的取消逻辑不被忽略。