RenderTargetBitmap.GetPixelsAsync() выбрасывает HResult 0x80004005 "Unspecified error", если приложение не на переднем плане

Я сохраняю RenderTargetBitmap в событии Suspending приложения. Все нормально, если у меня открыто приложение и я нажимаю "Приостановить и выключить" в Visual Studio. Но если я сначала зайду на начальный экран или открою другое приложение и подожду некоторое время, другими словами - приложение не на переднем плане, то метод RenderTargetBitmap.GetPixelsAsync() генерирует это исключение COMExult с HResult 0x80004005 и описанием "Unspecified error". Учитывая, что в реальном времени приостановка происходит, когда пользователь переключается с приложения на что-то другое, эта ошибка возникает почти всегда. RenderTargetBitmap, который я сохраняю определенно, на данный момент не является нулевым, потому что я проверяю это.

Также я заметил во время разработки, что иногда, когда я переключаюсь с приложения на что-то другое, а затем обратно, даже если приложение не было приостановлено и открывается мгновенно, некоторые изображения не отображаются в пользовательском интерфейсе, как если бы они были собраны мусором. Что довольно странно, учитывая, что на них все еще есть ссылки. Не уверен, если это связано с проблемой, описанной выше, но кажется, что может.

Кто-нибудь испытывал подобные проблемы? Что именно может происходить с этими изображениями, когда приложение выходит из экрана?

РЕДАКТИРОВАТЬ:

Вот пример. Xaml:

<Grid x:Name="RootGrid" Background="AntiqueWhite">
    <Rectangle Width="40" Height="50" Fill="Blue"/>
    <Rectangle Width="70" Height="50" Fill="Red" Margin="100 300 0 0"/>
    <Rectangle Width="30" Height="60" Fill="Green"  Margin="0 0 150 70"/>

    <Button x:Name="RenderButton" VerticalAlignment="Top" HorizontalAlignment="Center"
            Margin="0 20 0 0" Content="Render" Click="RenderButton_OnClick"/>
</Grid>

Код позади:

private RenderTargetBitmap renderTargetBitmap;


public MainPage()
{
    InitializeComponent();
    Application.Current.Suspending += CurrentOnSuspending;
}


private async void RenderButton_OnClick(object sender, RoutedEventArgs args)
{
    this.renderTargetBitmap = new RenderTargetBitmap();
    await this.renderTargetBitmap.RenderAsync(RootGrid);
}


private async void CurrentOnSuspending(object sender, SuspendingEventArgs args)
{
    var defferal = args.SuspendingOperation.GetDeferral();

    var file = await ApplicationData.Current.LocalFolder.CreateFileAsync(
        "render.png", CreationCollisionOption.ReplaceExisting);
    await SaveToFileAsync(this.renderTargetBitmap, file);

    defferal.Complete();
}


private async Task SaveToFileAsync(RenderTargetBitmap image, IStorageFile file)
{
    using (var stream = await file.OpenStreamForWriteAsync())
    {
        var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, stream.AsRandomAccessStream());
        var pixels = await image.GetPixelsAsync();
        encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore,
            (uint)image.PixelWidth, (uint)image.PixelHeight, 96, 96, pixels.ToArray());

        await encoder.FlushAsync();
    }
}

Запустите приложение на мобильном устройстве, нажмите кнопку "Отрисовка". После этого нажмите "Пуск", чтобы вывести приложение из экрана, подождите некоторое время (подойдет 10 секунд) и нажмите "Приостановить и завершить работу" в строке местоположения отладки в Visual Studio. Соблюдайте COMException.

0 ответов

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