InvalidOperationException с изображениями MediaLibrary

У меня есть приложение для Windows Phone, и иногда я получаю InvalidOperationExceptions, но не знаю, почему и как их избежать. Функция проблемы из сообщения об ошибке Microsoft.Xna.Framework.Media.MediaLibraryEnumerator_1[[System.__Canon,_mscorlib]].get_Item и я получаю эту трассировку стека

"Frame    Image                             Function                                                                                                                                    Offset        
0        Microsoft.Xna.Framework.ni.dll    Microsoft.Xna.Framework.Media.MediaLibraryEnumerator_1[[System.__Canon,_mscorlib]].get_Item                                                 0x0003e4d8    
1        Microsoft.Xna.Framework.ni.dll    Microsoft.Xna.Framework.Media.MediaLibraryEnumerator_1[[System.__Canon,_mscorlib]].System.Collections.IEnumerator.get_Current               0x00000006    
2        Microsoft.Xna.Framework.ni.dll    Microsoft.Xna.Framework.Media.MediaLibraryEnumerator_1[[System.__Canon,_mscorlib]].System.Collections.Generic.IEnumerator_T_.get_Current    0x0000001c    
3        MapLense.ni.DLL                   MapLense.Helper.PictureMapping.Add                                                                                                          0x000000a8    
4        MapLense.ni.DLL                   MapLense.Helper.PictureMapping+_GetPicture_d__b.MoveNext                                                                                    0x000000f6    
5        mscorlib.ni.dll                   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess                                                                              0x00216c46    
6        mscorlib.ni.dll                   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification                                                         0x0000003a    
7        mscorlib.ni.dll                   System.Runtime.CompilerServices.TaskAwaiter_1[[System.__Canon,_mscorlib]].GetResult                                                         0x0000001c    
8        MapLense.ni.DLL                   MapLense.Helper.Map+_AddPictureToMap_d__17.MoveNext                                                                                         0x00000118    
9        mscorlib.ni.dll                   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess                                                                              0x00216c46    
10       mscorlib.ni.dll                   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification                                                         0x0000003a    
11       mscorlib.ni.dll                   System.Runtime.CompilerServices.TaskAwaiter_1[[System.__Canon,_mscorlib]].GetResult                                                         0x0000001c    
12       MapLense.ni.DLL                   MapLense.MainPage+_ViewModelOnPropertyChanged_d__1e.MoveNext                                                                                0x00000204    
13       mscorlib.ni.dll                   System.Runtime.CompilerServices.AsyncMethodBuilderCore._ThrowAsync_b__0                                                                     0x00000036"

Я также попытался добавить блок try-catch вокруг блока кода, но безрезультатно

public static bool Add(DBPicture dbpicture)
{
    if (Pictures.ContainsKey(dbpicture.UniqueID))
        return true;

    var root = new MediaLibrary().RootPictureAlbum;

    foreach (var album in root.Albums)
    {
        if (album.Name != AppResources.CameraRollAlbumName) continue;

        for (var i = 0; i < album.Pictures.Count; i++)
        {
            try
            {
                var picture = album.Pictures[i];
                if (picture.Name == dbpicture.UniqueID)
                {
                    Pictures.Add(picture.Name, picture);
                    DBPictures.Add(picture.Name, dbpicture);
                    return true;
                }
            }
            catch (System.Exception e)
            {
#if DEBUG
                Logger.WriteLine("PictureMapping.Add(DBPicture)");
                Logger.WriteLine(e);
#endif
            }
        }
    }

    return false;
}

Спасибо за любые предложения

3 ответа

Не совсем один ответ, но если ошибка - первая foreach и try на втором это не ловит исключение положить try вне

try
{
    var root = new MediaLibrary().RootPictureAlbum;

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

  1. album.pictures не нуль
  2. Вместо этого, если перечислить album.Pictures попробуй что-то вроде album.Pictures.OrderBy(x=>x.Date);

Я знаю, это выглядит странно, но этот обходной путь работает.

Я столкнулся с этим исключением сегодня в моем приложении WP 8.0. Пользователь получает несколько миниатюрных изображений своей медиатеки "Camera Roll" в пользовательском элементе управления. Когда он выбирает одну из этих миниатюр, я пытаюсь получить реальное изображение через "GetImage()". Миниатюры работали нормально, но GetImage () выдал исключение. Видимо (это мое предположение) некоторые изображения были повреждены или повреждены. Это никогда не работало с ними, но другие картины не имели проблем.

Так что имейте в виду, что это может быть также поврежденный или поврежденный файл.

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