IBM Lotus Notes Domino DLL

API взаимодействия Domino, который включен в Lotus Notes, вызывает исключение нехватки памяти в.NET, когда объект на основе класса NotesDXLExporter не может экспортировать 390-ю запись, которая является большим документом, после экспорта 389 записей (которые являются документами меньшего размера).

Вот фрагмент кода:

  1. Я инициализирую класс NotesDXLExporter.

    Примечания DXLExporter dxl1 = null;

  2. Затем я настраиваю объект NotesDXLExported, как показано ниже:

    dxl1 = notesSession.CreateDXLExporter (); dxl1.ExitOnFirstFatalError = false; dxl1.ConvertNotesbitmapsToGIF = true; dxl1.OutputDOCTYPE = false;

  3. Затем я выполняю цикл 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;

}
Другие вопросы по тегам