当基于NotesDXLExporter类的对象在导出389条记录(较小的文档)后无法导出第390条记录(这是一个大文档)时,Lotus Notes附带的Domino互操作API会在.NET中导致内存不足异常。
这是一个代码片段:
我初始化NotesDXLExporter类。
注意DXLExporter dxl1 = null;
然后,我配置NotesDXLExported对象,如下所示:
dxl1 = notesSession.CreateDXLExporter(); dxl1.ExitOnFirstFatalError = false; dxl1.ConvertNotesbitmapsToGIF = true; dxl1.OutputDOCTYPE = false;
然后,我在使用dxl1类读取文档时执行以下所示的for循环(下面显示发生异常的行)。
NotesView vincr = database.GetView(@“(AllIssuesView)”); //从NSF文件中查看(int i = 1; i <vincr.EntryCount; 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问题,但是我不知道我是否缺少什么?
能否请您对此有所说明?
提前致谢。
子部
您还没有说过要使用的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;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句