У меня есть метод, который должен обрабатывать предоставленный пользователем файл, и если файл достаточно сложный, я могу столкнуться с OutOfMemoryException
. В этих случаях я отлично справляюсь с тем, что метод не работает, но я хочу, чтобы приложение оставалось пригодным для использования, проблема в том, что после получения OutOfMemoryException
я ничего не могу сделать, так как каждый ход действия потребляет память.Восстановление из OutOfMemoryException
Я думал о том, чтобы отложить в сторону некоторую память, которую я могу освободить после того, как исключение будет выбрано, чтобы остальная часть приложения могла продолжить, но похоже, что оптимизатор избавляется от этого распределения.
public void DoStuff(string param)
{
try
{
#pragma warning disable 219
var waste = new byte[1024 * 1024 * 100]; // set aside 100 MB
#pragma warning restore 219
DoStuffImpl(param);
}
catch (OutOfMemoryException)
{
GC.Collect(); // Now `waste` is collectable, prompt the GC to collect it
throw; // re-throw OOM for treatment further up
}
}
Короче мои вопросы:
- Есть ли лучший способ сделать то, что я пытаюсь?
- Если нет, есть ли веская причина, почему это плохая идея?
- Предполагая, что эта идея - путь, как заставить JIT не оптимизировать мою память
waste
?
Сделайте свою программу 64-битной и добавьте эту строку в свой файл app.config: http://msdn.microsoft.com/en-us/library/hh285054(v=vs.110).aspx –
Или, альтернативно, проверьте файл размер. –
@newStackExchangeInstance Я не хочу устанавливать произвольные ограничения на размер файла, и в любом случае объем потребляемой памяти строго не коррелирует с размером файла. Что касается 64-битного, это в настоящее время не вариант, так как многие другие части приложения являются C++, и поэтому переход на 64 бит имеет много последствий. – Motti