WP8.1 C# Windows Phone 8.1 Ошибка потока фоновой задачи WriteableBitmap

Я пытаюсь обновить изображение группы Me Tile из фоновой задачи и получаю следующую ошибку в WriteableBitmap:

System.Exception: The application called an interface that was marshalled for a different thread. (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))
   at Windows.UI.Xaml.Media.Imaging.WriteableBitmap..ctor(Int32 pixelWidth, Int32 pixelHeight)
   at BackgroundTaskCS.UpdateBandTask.<LoadImage>d__f.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)

Похоже, что WriteableBitmap нужно запускать в потоке пользовательского интерфейса, но я не думаю, что у меня есть доступ к потоку пользовательского интерфейса, поскольку мне нужно обновить плитку, не открывая приложение. Есть ли альтернативное решение для этого?

Ниже приведена задача, которую я использую. Заранее спасибо.

Я начал этот вопрос здесь и был направлен в stackoverflow из-за полосы.

public async void Run(IBackgroundTaskInstance taskInstance)
        {
            BackgroundTaskDeferral _deferral = taskInstance.GetDeferral();

             await UpdateMeTile();
            Debug.WriteLine("CS Task Run");

            _deferral.Complete();
        }

        private static async Task UpdateMeTile()
        {

            /// <summary>
            /// Connect to Microsoft Band and change the wallpaper.
            /// </summary>

            try
            {
                // Get the list of Microsoft Bands paired to the phone.
                IBandInfo[] pairedBands = await BandClientManager.Instance.GetBandsAsync();
                if (pairedBands.Length < 1)
                {
                    return;
                }

                // Connect to Microsoft Band.
                using (IBandClient bandClient = await BandClientManager.Instance.ConnectAsync(pairedBands[0]))
                {
                    // Change the wallpaper.
                    await bandClient.PersonalizationManager.SetMeTileImageAsync(await LoadImage("ms-appx:///Assets/SampleMeTileImage.jpg"));

                }

            }
            catch (Exception ex)
            {
                //this.textBlock.Text = ex.ToString();
                Debug.WriteLine("!!!!!!!!!!!!!!!!!!Exception. {0}", ex);
            }

        }


        private static async Task<BandImage> LoadImage(string uri)
        {
            StorageFile imageFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri(uri));

            using (IRandomAccessStream fileStream = await imageFile.OpenAsync(FileAccessMode.Read))
            {

                WriteableBitmap bitmap = new WriteableBitmap(1, 1);
                await bitmap.SetSourceAsync(fileStream);
                bitmap.ToBandImage();
                return bitmap.ToBandImage();
            }
        }

person cosgreen    schedule 12.05.2015    source источник


Ответы (1)


Как упомянул Роб Каплан в исходном сообщении на форуме MSDN, убедитесь, что ваша фоновая задача получена из XamlRenderingBackgroundTask. Это гарантирует, что метод OnRun() вашей фоновой задачи будет вызываться в «потоке пользовательского интерфейса» (в целях использования типов, связанных с пользовательским интерфейсом, таких как WriteableBitmap).

person Phil Hoff -- MSFT    schedule 15.05.2015