Не удается сохранить содержимое InkCanvas в приложении UWP в базе данных SQLite, когда включен режим выпуска

У меня возникла проблема с сохранением содержимого InkCanvas в приложении UWP. В режиме отладки все работает отлично. В режиме деблокирования я не могу его сохранить.

Блоб в базе данных sqlite все время пуст (в режиме выпуска).

Вот мой код:

static public byte[] GetByteArray(InkCanvas CardInkCanvas) {
    MemoryStream ms = new MemoryStream();

    // Write the ink strokes to the output stream.
    using(IOutputStream outputStream = ms.AsOutputStream()) {
        CardInkCanvas.InkPresenter.StrokeContainer.SaveAsync(ms.AsOutputStream());
        outputStream.FlushAsync();
    }

    return ms.ToArray();
}

Может быть, профессионал UWP может мне помочь :)

Спасибо, Агредо.


person Agredo    schedule 20.11.2016    source источник
comment
Не могли бы вы проверить, не пусто ли содержимое возвращаемого массива?   -  person Martin Zikmund    schedule 21.11.2016
comment
он пуст в режиме выпуска. В режиме отладки работает отлично.   -  person Agredo    schedule 21.11.2016


Ответы (1)


У меня возникла проблема с сохранением содержимого InkCanvas в приложении UWP. В режиме отладки все работает отлично. В режиме деблокирования я не могу его сохранить.

При компиляции выпуска используйте .Net Native от По умолчанию. Таким образом, есть некоторые отличия в поведении по сравнению с режимом отладки.

В данном случае CardInkCanvas.InkPresenter.StrokeContainer.SaveAsync и outputStream.FlushAsync являются асинхронными функциями, перед ними нужно добавить await. Итак, ваши коды должны выглядеть так:

static public async Task<byte[]> GetByteArray(InkCanvas CardInkCanvas) {
    MemoryStream ms = new MemoryStream();

    // Write the ink strokes to the output stream.
    using(IOutputStream outputStream = ms.AsOutputStream()) {
        //Add await before async functions so that the async functions get executed before return.
        await CardInkCanvas.InkPresenter.StrokeContainer.SaveAsync(ms.AsOutputStream());
        await outputStream.FlushAsync();
    }

    return ms.ToArray();
}
person Elvis Xia - MSFT    schedule 21.11.2016
comment
Функция также должна быть объявлена ​​async. - person Peter Torr - MSFT; 21.11.2016
comment
Спасибо, но теперь мой код byte[] strokeContainerArray = GetByteArrayAsync(CardInkCanvas).Result; останавливается в режиме выпуска. В режиме отладки работает... - person Agredo; 21.11.2016
comment
Да, я забыл добавить async и изменить тип возвращаемого значения на Task<byte[]>. @PeterTorr-MSFT Спасибо, что напомнили. @Agredo, я обновил ответ, попробуйте обновленные коды. - person Elvis Xia - MSFT; 21.11.2016
comment
это не сработает, если метод не асинхронный. Моя проблема в том, что я не знаю, как справиться с этой задачей с параметром в моем следующем коде. Я хочу сохранить этот результат в своей базе данных. но я не получаю результат этого метода.byte[] strokeContainerArray = GetByteArrayAsync(CardInkCanvas).Result; В режиме выпуска приложение останавливается. Кажется, задача никогда не заканчивается. - person Agredo; 21.11.2016
comment
Пожалуйста, не используйте GetByteArrayAsync(CardInkCanvas).Result вместо этого используйте await GetByteArrayAsync(CardInkCanvas). - person Elvis Xia - MSFT; 21.11.2016
comment
Спасибо. Это работает отлично. Я не знаю, почему я такой тупой и не использовал ожидание! - person Agredo; 21.11.2016