WP8 NullReferenceException при сохранении изображения в медиатеку

Иногда (я еще не нашел шаблон) я получаю исключение NullReferenceException, когда пытаюсь сохранить изображение в медиа-библиотеке. Проблема в методе SavePicture, я просто использую его.

using (var isoStore = IsolatedStorageFile.GetUserStoreForApplication())
{
    if (isoStore.FileExists("fileName"))
    {
        using (var fileStream = isoStore.OpenFile("fileName", FileMode.Open))
        {
            MediaLibrary library = new MediaLibrary();
            library.SavePicture("name", fileStream);
        }
    }
}

fileStream, как вы можете видеть из кода IsolatedStorageFileStream, является допустимым, а не нулевым. Это моя трассировка стека

at Microsoft.Xna.Framework.Media.UnsafeNativeMethods.MediaLibrary_SavePicture(String name, Int32 nameLength, UInt32 stream, UInt32& picture)
at Microsoft.Xna.Framework.Media.MediaLibrary.SavePicture(String name, Stream source)

Из свойства Position в потоке я вижу, что это не 0, поэтому я предполагаю, что та же часть потока уже была сохранена, но во время буферизации для большего количества произошло что-то не так. это всегда происходит с большими изображениями (+ 4 МБ), но не обязательно с одним и тем же изображением каждый раз, когда возникает исключение, и я использую одну и ту же коллекцию изображений. Если я поймаю исключение и попытаюсь снова сохранить изображение, не открывая файл снова, только с тем же потоком (мне нужно только установить положение на 0), то изображение сохраняется без проблем.

Любые идеи? Любая помощь будет оценена по достоинству.


person Tomas Kosar    schedule 02.04.2014    source источник
comment
Просмотрите этот вопрос и посмотрите, охватили стандартные базы. Если это так, попробуйте добавить эту деталь к этому вопросу, чтобы отличить его от стандартного, что-то является нулевой ошибкой.   -  person Adam Houldsworth    schedule 02.04.2014
comment
@Tom Kos измените FileMode Opent на Read.   -  person Jaihind    schedule 02.04.2014
comment
@Adam Houldsworth: я просматриваю этот вопрос и ответы, но я думаю, что знаю, что означает это исключение, и я думаю, что разместил все подробности, которые я мог предоставить и которые имеют отношение к этому делу. Исключение вызывается методом SavePicture, и я считаю, что мой ввод правильный. я думаю, что может быть какая-то проблема внутри этого метода...   -  person Tomas Kosar    schedule 02.04.2014
comment
@Jaihind: я попробую это и протестирую, но я не уверен, будет ли это по-другому и поможет ли это.   -  person Tomas Kosar    schedule 02.04.2014
comment
@TomKos Достаточно честно, я просто уходил от варианта «закрыть как дубликат», поскольку вопросы NullReferenceException, как правило, всегда приводят к чему-то простому. Как становится очевидным, этот случай не сразу очевиден. Надеюсь, люди прочитают это и не захотят закрыться :-)   -  person Adam Houldsworth    schedule 02.04.2014
comment
@ Адам Хаулдсворт: раджа нашел, в чем проблема. его известная ошибка, по-видимому.   -  person Tomas Kosar    schedule 02.04.2014
comment
@TomKos Да, я вижу, но обратите внимание, что предоставленный код, вероятно, не будет скомпилирован, поскольку, насколько мне известно, вы не можете преобразовать IsolatedStorageFileStream в MemoryStream.   -  person Adam Houldsworth    schedule 02.04.2014
comment
@Adam Houldsworth: я не пробовал, но это не важно для меня. Я понимаю, что раджа говорит об использовании массива вместо потока, но, как я уже сказал, это может быть не лучшим решением в моем случае.   -  person Tomas Kosar    schedule 02.04.2014
comment
@TomKos Достаточно справедливо, но для SO важно предоставить исчерпывающие ответы для будущих посетителей. Я удалил некомпилируемый код в любом случае.   -  person Adam Houldsworth    schedule 02.04.2014


Ответы (1)


Это известная ошибка некоторых методов MediaLibrary. Обычно это происходит с большими изображениями размером от 4 до 16 МБ.

Не уверен в статусе исправления ошибки. Вот ссылка для подключения: http://connect.microsoft.com/VisualStudio/feedback/details/776453/savepicturetocameraroll-randomly-throws-nullreferenceexception

Одним из обходных путей для смягчения проблемы является использование потока памяти, если ваш код находится в потоке пользовательского интерфейса, а не в каком-либо рабочем потоке:

using (var isoStore = IsolatedStorageFile.GetUserStoreForApplication())
{
    if (isoStore.FileExists("fileName"))
    {
        using (var fileStream = isoStore.OpenFile("fileName", FileMode.Open))
        {
            byte[] bytes = new byte[0]; // Read bytes from fileStream

            MediaLibrary library = new MediaLibrary();
            library.SavePicture("name", bytes);
        }
    }
}

Другие wprkarounds включают выполнение GC.Collect() перед вызовом этого метода, использование try/catch для повторной попытки И, наконец, уменьшение размера изображения, если это возможно.

person Raja Nadar    schedule 02.04.2014
comment
IsolatedStorageFileStream (из OpenFile) нельзя так преобразовать в MemoryStream. Байты должны быть считаны вручную в поток памяти или byte[] для предоставления методу SavePicture(string, byte[]). - person Adam Houldsworth; 02.04.2014
comment
хорошо, это именно то, чего я боялся. но спасибо за уточнение. я не смог найти это сам, но я искал другой метод, и я предполагаю, что они более или менее одинаковы. Я тоже думал об использовании массива, но у меня будут проблемы с хранением такого большого количества памяти в тех же случаях. В любом случае, это моя проблема, и я, вероятно, буду придерживаться своего обходного пути, просто пытаясь сохранить его несколько раз, если это необходимо. - person Tomas Kosar; 02.04.2014