BitmapImage SetSourceAsync в WinRT C++

Я новичок в WinRT C++. Я пытаюсь передать образ StorageFile из C# и открыть файл и установить его в качестве источника в BitmapImage в WinRT для извлечения высоты и ширины изображения. Я использую следующий код.

auto openOperation = StorageImageFile->OpenAsync(FileAccessMode::Read); // from http://msdn.microsoft.com/en-us/library/windows/desktop/hh780393%28v=vs.85%29.aspx
openOperation->Completed = ref new
    AsyncOperationCompletedHandler<IRandomAccessStream^>(
    [=](IAsyncOperation<IRandomAccessStream^> ^operation, AsyncStatus status)
{
    auto Imagestream = operation->GetResults(); 
    BitmapImage^ bmp = ref new BitmapImage();
    auto bmpOp = bmp->SetSourceAsync(Imagestream);
    bmpOp->Completed = ref new 
        AsyncActionCompletedHandler (
        [=](IAsyncAction^ action, AsyncStatus status)
    {
        action->GetResults();
        UINT32 imageWidth = (UINT32)bmp->PixelWidth;
        UINT32 imageHeight = (UINT32)bmp->PixelHeight;
    });
});

Этот код, похоже, не работает. после строки BitmapImage^ bmp = ref new BitmapImage(); отладчик перестает говорить, что исходный код не найден. Можете ли вы помочь мне написать правильный код?

1 ответ

Решение

Я думаю, что ты хотел написать openOperation->Completed+=ref new... а также bmpOp->Completed+=ref new..., Я не эксперт в C++, но из того, что я видел, асинхронные операции обычно заключаются в create_task звонки. Не совсем уверен, почему - может быть, чтобы избежать подписки на события без отписки?

Я думаю, это должно выглядеть примерно так:

auto bmp = ref new BitmapImage();

create_task(storageImageFile->OpenAsync(FileAccessMode::Read)) // get the stream
    .then([bmp](IRandomAccessStream^ ^stream) // continuation lambda
{
    return create_task(bmp->SetSourceAsync(stream)); // needs to run on ASTA/Dispatcher thread
}, task_continuation_context::use_current()) // run on ASTA/Dispatcher thread
    .then([bmp]() // continuation lambda
{
        UINT32 imageWidth = (UINT32)bmp->PixelWidth; // needs to run on ASTA/Dispatcher thread
        UINT32 imageHeight = (UINT32)bmp->PixelHeight; // needs to run on ASTA/Dispatcher thread

        // TODO: use imageWidth and imageHeight
}, task_continuation_context::use_current()); // run on ASTA/Dispatcher thread
Другие вопросы по тегам