0

我有一个 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
4

1 回答 1

0

发生此异常的原因是您没有在任务链中返回 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;
    });

}
于 2019-07-26T08:47:17.640 回答