当基于NotesDXLExporter类的对象导出389条记录(这是一个较小的文档)导致第390条记录(这是一个大文档)时,Lotus Notes附带的Domino互操作API会导致.NET中出现内存不足异常)。
以下是代码段:
我初始化了NotesDXLExporter类。
NotesDXLExporter dxl1 = null;
然后我配置NotesDXLExported对象,如下所示:
dxl1 = notesSession.CreateDXLExporter(); dxl1.ExitOnFirstFatalError = false; dxl1.ConvertNotesbitmapsToGIF = true; dxl1.OutputDOCTYPE = false;
然后我在使用dxl1类读取文档时执行下面显示的循环(发生异常的行如下所示)。
NotesView vincr = database.GetView(@"(AllIssuesView)"); //从NSF文件查看 for(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问题,但我不知道我是否遗漏了什么?
你能否对此有所了解?
提前致谢。
Subbu
答案 0 :(得分:0)
您还没有说过您正在使用的Lotus Notes版本。鉴于DXL的历史,我想说你应该尽可能在最新版本的Notes上试用你的代码。
但是,我没有看到任何召回回收()。无法为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;
}