Исключения .net Out of Memory в Windows Mobile - как преодолеть эту проблему? - PullRequest
0 голосов
/ 24 марта 2009

В настоящее время я пишу небольшое приложение в Windows Mobile с использованием CF.NET.

Приложение очень похоже по своему поведению на приложение электронной почты, т.е. я использую POP3 для загрузки сообщений и вложений из моей учетной записи почтового сервера для хранения на карте памяти для дальнейшей обработки с помощью MIME-инструмента.

Моя проблема - загрузка больших вложений, потому что в определенный момент я получаю исключение OutOfMemory. Я узнал кое-что интересное об этом, прочитав следующий вопрос и ответы, опубликованные здесь, на SO на днях. Поскольку мои вложения могут составлять 4-5 МБ (mp3-песни), я понимаю, что у меня серьезные проблемы. Однако в то же время Pocket Outlook может без проблем загружать mp3-песни объемом до 4-5 МБ (используя WIFI-соединение), поэтому должен быть способ сделать это!

В данный момент я сохраняю буфер загрузки (преобразованный в строку) в простую строковую переменную. Я попытался добавить содержимое буфера в построитель строк, но все еще получаю исключения OutOfMemory.

Какую стратегию / технику я могу адаптировать для преодоления этой проблемы?

1 Ответ

10 голосов
/ 24 марта 2009

Каждый раз, когда вы работаете с большими объемами данных, вы хотите убедиться, что не храните все это в памяти сразу.

Ваш канал загрузки представляет собой поток, поэтому вы можете загружать данные порциями. При записи файла на диск у вас есть поток, поэтому вы можете записать его порцией за раз.

Подумайте о разгрузке прицепа для трактора на склад. С вашим решением для работы со строками вы в основном говорите: «Я встану сзади трейлера и хочу, чтобы вы загрузили все содержимое трейлера в мои руки, а затем я отнесу его на склад» , Вы будете раздавлены грузом! Вместо этого вы хотите: «Дайте мне достаточно, чтобы я мог нести его, затем я отнесу его на склад, а затем вернусь к следующему грузу».

...