Продолжение задачи с IAsyncOperation в UWP
У меня есть объект класса C++, который выполняет некоторую обработку в фоновом режиме приложения UWP.
Его процесс обработки вызывается методом "Обновления" Unity ~ 60fps через UWP IAsyncOperation
,
Класс имеет isBusy
свойство, которое установлено в true
после вызова операции, чтобы заблокировать ее повторный вызов из единицы до ее завершения.
Используя продолжение задачи, я хотел бы установить значение false после завершения обработки и возврата через IAsyncOperation
,
IAsyncOperation<ResultsWrapper^>^ SomeClass::SomeClassUpdateMethod() {
return concurrency::create_async([this]() -> ResultsWrapper^
{
// Block processing
SomeClass::isBusy = true;
// Process image and return to await
LongRunningTask().then([this]() {
return SomeClass::TaskResults;
}).then([this]() {
isBusy = false;
});
});
}
concurrency::task<void> SomeClass::LongRunningTask(){
auto results = ref new TaskResults();
'''Work happens here'''
SomeClass::TaskResults = results;
}
То, что я ожидаю, случится для ResultWrapper
объект должен быть возвращен в основной поток вызывающего приложения (Unity), затем isBusy
флаг объекта, установленный на false при продолжении задачи.
Что происходит, это:
Error C2338 incorrect parameter type for the callable object in 'then'; consider _ExpectedParameterType or task<_ExpectedParameterType> (see below) \....\include\ppltasks.h
1 ответ
Причина, по которой произошло это исключение, заключается в том, что вы не возвращали тип ResultsWrapper^ в цепочках задач. Второй записанный вами возврат означает передачу значения в следующую цепочку для использования вместо возврата значения задачи. Так что вы должны писать как следующий код, чтобы вернуть значение правильно.
IAsyncOperation<ResultsWrapper^>^ SomeClass::SomeClassUpdateMethod()
{
return concurrency::create_async([this]() -> concurrency::task<ResultsWrapper^>
{
SomeClass::isBusy = true;
return LongRunningTask().then([this]() -> ResultsWrapper^
{
isBusy = false;
return SomeClass::TaskResults;
});
});
}
Код "return LongRunningTask(). Then(this ->ResultsWrapper^)" означает преобразование объекта ResultsWrapper^ в задачу и ее возврат.
Возвращаемое значение метода "LongRunningTask" task<void>
так что вам еще нужно вернуть task<void>
стоимость.
concurrency::task<void> SomeClass::LongRunningTask()
{
return concurrency::create_task(
[this]()
{
auto results = ref new TaskResults();
'''Work happens here'''
SomeClass::TaskResults = results;
});
}