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, а не с вашим кодом. Наконец мне удалось воспроизвести его на устройстве, но это происходит только в том случае, если отладчик отключен. Две вещи, которые вы должны убедиться.
album.pictures
не нуль- Вместо этого, если перечислить
album.Pictures
попробуй что-то вродеalbum.Pictures.OrderBy(x=>x.Date);
Я знаю, это выглядит странно, но этот обходной путь работает.
Я столкнулся с этим исключением сегодня в моем приложении WP 8.0. Пользователь получает несколько миниатюрных изображений своей медиатеки "Camera Roll" в пользовательском элементе управления. Когда он выбирает одну из этих миниатюр, я пытаюсь получить реальное изображение через "GetImage()". Миниатюры работали нормально, но GetImage () выдал исключение. Видимо (это мое предположение) некоторые изображения были повреждены или повреждены. Это никогда не работало с ними, но другие картины не имели проблем.
Так что имейте в виду, что это может быть также поврежденный или поврежденный файл.