我有一个例程,可以读取XPS文档并剪切页面以分离文档。最初,它阅读了一份文件,决定如何将其切碎,关闭并写出新文件。
添加了一些功能,在运行例程之前清理旧文件会让人头疼,所以我保存了所有切碎的部分,以便在最后写出。
ChoppedXPS是一个字典,关键是文件名,数据是从原始文件准备的FixedDocument:
foreach (String OneReport in ChoppedXPS.Keys)
{
File.Delete(OneReport);
using (XpsDocument TargetFile = new XpsDocument(OneReport, FileAccess.ReadWrite))
{
XpsDocumentWriter Writer = XpsDocument.CreateXpsDocumentWriter(TargetFile);
Writer.Write(ChoppedXPS[OneReport]);
Logger($"{OneReport} written to disk", 2);
}
Application.DoEvents();
}
如果此处写入的FixedDocument包含图形,则Writer.Write行将打开源文件,并保持打开状态,直到程序关闭。
XpsDocumentWriter似乎没有实现任何可以用来清理它的东西。
(是的,Application.DoEvents很难看——这是一个由两个人使用的内部程序,不值得在后台运行,如果没有它,一项足够大的任务可能会导致Windows认为它没有响应并将其扼杀。是的,我知道如何缩进——我把它们拿出来让它都适合这个屏幕。(
.Net 4.5,使用了一些C#8.0功能。
我找到了解决这个问题的方法。我不会试图发布整件事,因为我必须改变整个数据处理,但它的核心是:
using (XPSDocument Source = new XPSDocument(SourceFile, FileAccess.Read)
{
[the using loop from my question]
}
我仍然希望得到理解,并找到比这种方法更合适的方法。
是的——这会产生一个警告,说明Source未使用,但编译器并没有消除它,所以它确实可以工作。