Продолжение задачи с 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;
    });

}
Другие вопросы по тегам