Я пытаюсь написать фоновый поток на основе сопрограмм в C ++ / WinRT, который зацикливается на состоянии токена отмены, потому что мне нужно предпринять некоторые действия по очистке отмены.
Я пытаюсь следовать документации по MSDN (https://docs.microsoft.com/en-us/windows/uwp/cpp-and-winrt-apis/concurrency#canceling-an-asychronous-operation-and-cancellation-callbacks), но адаптация примера кода не компилируется, а тип cancellation_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();
}
К сожалению, это не скомпилируется с ошибкой «C2064: term не оценивает функцию, принимающую 0 аргументов» со ссылкой на строку while (! Token ()).
Код согласен с этим, так как определение (в base.h) get_cancellation_token_t равно
struct get_cancellation_token_t {};
Я полагаю, что я делаю что-то не так, или документация MSDN устарела. Есть какие-нибудь подсказки? Спасибо!