IBM Lotus Notes Domino DLL
API взаимодействия Domino, который включен в Lotus Notes, вызывает исключение нехватки памяти в.NET, когда объект на основе класса NotesDXLExporter не может экспортировать 390-ю запись, которая является большим документом, после экспорта 389 записей (которые являются документами меньшего размера).
Вот фрагмент кода:
Я инициализирую класс NotesDXLExporter.
Примечания DXLExporter dxl1 = null;
Затем я настраиваю объект NotesDXLExported, как показано ниже:
dxl1 = notesSession.CreateDXLExporter (); dxl1.ExitOnFirstFatalError = false; dxl1.ConvertNotesbitmapsToGIF = true; dxl1.OutputDOCTYPE = false;
Затем я выполняю цикл for, показанный ниже, при чтении документов с использованием класса dxl1 (строка, в которой происходит исключение, указана ниже).
NotesView vincr = database.GetView (@ "(AllIssuesView)"); // просмотр из файла NSF для (int i = 1; i
vincrdoc = vincr.GetNthDocument(i); System.IO.File.WriteAllText(@"C:\Temp\" + i + @".txt", dxl1.Export(vincrdoc)); //OUT OF MEMORY EXCEPTION HAPPENS HERE WHEN READING A BIG DOCUMENT. } catch(Exception ex) { Console.WriteLine(ex); }
Я пытался использовать другую версию Interop domino dll и не имел успеха.
Как я понимаю, я вижу проблему с API, но я не знаю, что я что-то упустил?
Не могли бы вы пролить свет на это?
Заранее спасибо.
Subbu
1 ответ
Вы не сказали, с какой версией Lotus Notes вы работаете. Учитывая историю DXL, я бы сказал, что вы должны попробовать свой код в последней версии Notes, которую вы, возможно, можете.
Но также я не вижу вызовов recycle(). Невозможность вызова recycle () для объектов Domino приводит к утечке памяти из внутренних классов Domino, и, так как у вас заканчивается память, это может способствовать вашей проблеме. Вы также не должны использовать цикл for и getNthDocument. Вы должны использовать getFirstDocument и цикл while с getNextDocument. Вы получите намного лучшую производительность. Соединение этих двух вещей приводит вас к общему шаблону использования временного документа для хранения результата getNextDocument, позволяя вам переработать текущий документ, а затем назначить временный документ текущему, что будет примерно так (не ошибка). -checked!)
NotesView vincr = database.GetView(@"(AllIssuesView)"); //view from an NSF file
vincrdoc = vincr.getFirstDocument();
while (vincrdoc != null)
{
try {
System.IO.File.WriteAllText(@"C:\Temp\" + i + @".txt", dxl1.Export(vincrdoc));
}
catch(Exception ex)
{
Console.WriteLine(ex);
}
Document nextDoc = vincr.getNextDocument(vincrdoc);
vincrdoc.recycle();
vincrdoc = nextDoc;
}