0

当基于 NotesDXLExporter 类的对象在导出 389 条记录(较小的文档)后无法导出第 390 条记录(一个大文档)时,Lotus Notes 中包含的 Domino 互操作 API 会导致 .NET 中出现内存不足异常。

这是一个代码片段:

  1. 我初始化 NotesDXLExporter 类。

    NotesDXLExporter dxl1 = null;

  2. 然后我配置 NotesDXLExported 对象,如下所示:

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

  3. 然后,我在使用 dxl1 类读取文档时执行如下所示的 for 循环(发生异常的行如下所示)。

    NotesView vincr = database.GetView(@"(AllIssuesView)"); //从 NSF 文件中查看 for (int i = 1; i < vincr.EntryCount; i++) { try {

                    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 问题,但我不知道我是否遗漏了什么?

你能解释一下吗?

提前致谢。

副部

4

1 回答 1

0

您还没有说您正在使用的 Lotus Notes 版本。鉴于 DXL 的历史,我会说您应该尽可能在最新版本的 Notes 上尝试您的代码。

而且,我没有看到任何对 recycle() 的调用。未能为 Domino 对象调用 recycle() 会导致内存从 Domino 后端类泄漏,并且由于内存不足,它可能会导致您的问题。您也不应该使用 for 循环和 getNthDocument。您应该使用 getFirstDocument 和带有 getNextDocument 的 while 循环。您将获得更好的性能。将这两件事放在一起会导致您使用临时文档来保存 getNextDocument 的结果的常见模式,允许您回收当前文档,然后将临时文档分配给当前,这将是这样的(不是错误-检查!)

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;

}
于 2014-07-09T22:01:42.650 回答