Windows Phone 8.1 — исключение при создании WriteableBitmap из фоновой задачи

Я создаю приложение для Windows Phone 8.1 (Windows Runtime, а не Windows Phone Silverlight 8.1). Я создал фоновую задачу, которую запускаю с помощью триггера обслуживания. Внутри фоновой задачи мне нужно создать WriteableBitmap из одного изображения Camera Roll. Мой код выглядит следующим образом:

public sealed class Class1 : IBackgroundTask
{
    public async void Run(IBackgroundTaskInstance taskInstance)
    {
        BackgroundTaskDeferral deferral = taskInstance.GetDeferral();

        var files = await KnownFolders.CameraRoll.GetFilesAsync();

        ShowNotification("Process has started");

        using(var fileStream = await files[0].OpenStreamForReadAsync())
        {
            WriteableBitmap writeableBitmap = await BitmapFactory.New(1, 1).FromStream(fileStream.AsRandomAccessStream());
        }

        ShowNotification("Process has ended");

        deferral.Complete();
    }
}

Когда я запускаю фоновую задачу, два уведомления работают должным образом, но я получаю следующие исключения:

"A first chance of exception of type "System.Exception" occurred in WriteableBitmapEx.WinRT.DLL""
"A first chance of exception of type "System.Exception" occurred in mscorlib.dll"

"The proccess has ended with code 1 (0x1)"

Если я удалю эти строки:

using(var fileStream = await files[0].OpenStreamForReadAsync())
{
    WriteableBitmap writeableBitmap = await BitmapFactory.New(1, 1).FromStream(fileStream.AsRandomAccessStream());
}

Все работает как положено, появляются 2 уведомления и никаких исключений не выдается.

Есть идеи?

Спасибо.


person fergaral    schedule 18.01.2015    source источник
comment
Что такое сообщение об исключении?   -  person Fred    schedule 19.01.2015
comment
Интересно, может быть, WritableBitmap может быть создан/использован только в потоке пользовательского интерфейса (которого нет в фоновой задаче)?   -  person Decade Moon    schedule 19.01.2015
comment
Да, насколько мне известно, растровое изображение можно сделать только в потоке пользовательского интерфейса!   -  person Depechie    schedule 19.01.2015
comment
Значит, невозможно создать WriteableBitmap в BackgroundTask?   -  person fergaral    schedule 19.01.2015
comment
Сообщение об исключении: Приложение вызвало интерфейс, который был маршалирован для другого потока. (Исключение из HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))   -  person fergaral    schedule 19.01.2015


Ответы (1)


Используйте XamlRenderingBackgroundTask для создания графики XAML в фоновом режиме. Обратите внимание, что для этого рекомендуется использовать C++, чтобы свести к минимуму использование памяти.

person Peter Torr - MSFT    schedule 19.01.2015