将多个.xps文档打印到物理打印机时出现此错误
Dim defaultPrintQueue As PrintQueue = GetForwardPrintQueue(My.Settings.SelectedPrinter)
Dim xpsPrintJob As PrintSystemJobInfo
xpsPrintJob = defaultPrintQueue.AddJob(JobName, Document, False)
文档被成功假脱机,直到发生打印作业异常
InnerException是内存不足,无法继续执行程序。
源是PresentationCore.dll
我应该从哪里开始搜索?
答案 0 :(得分:5)
当尝试执行因某些资源的临时或永久限制而可能失败的任务时,我倾向于使用退避策略。在消息排队和套接字打开等各种事情上遵循了这种策略。
此类策略的一般流程如下:
set maxdelay to 16 # maximum time period between attempts
set maxtries to 10 # maximum attempts
set delay to 0
set tries to 0
while more actions needed:
if delay is not 0:
sleep delay
attempt action
if action failed:
add 1 to tries
if tries is greater than maxtries:
exit with permanent error
if delay is 0:
set delay to 1
else:
double delay
if delay is greater than maxdelay:
set delay to maxdelay
else:
set delay to 0
set tries to 0
这允许进程在绝大多数情况下以全速运行,但在错误开始时退出,希望给资源提供者时间恢复。延迟的逐渐增加允许更严格的资源限制来恢复,并且最大尝试会捕获您所谓的永久性错误(或者需要花费很长时间才能恢复的错误)。
我实际上更喜欢这种try-it-and-catch-failure方法来检查if-okay-then-try,因为如果检查和try之间发生了某些变化,后者仍然经常会失败。这被称为“更好地寻求宽恕而不是请求许可”方法,这种方法在大多数时候对老板也很有效,并且妻子经常使用不多: - )
一个特别有用的案例是为每个短期交易打开一个单独的TCP会话的程序。在较旧的硬件上,关闭的套接字(处于TCP WAIT状态的套接字)最终会在再次需要之前消失。
但是,随着硬件变得越来越快,我们发现我们可以打开会话并且更快地工作,并且Windows用完TCP句柄(即使增加到最大值)。
不是必须重新设计通信协议来维护会话,而是实施了这一策略,以便在事件句柄被饿死时进行优雅的恢复。
虽然它有点像kludge,但这是接近生命终结的传统软件,其中错误修复通常足以使其正常工作,并且它被认为不足以保证在修复方面花费大量资金它正确。
更新:可能是PresentationCore存在(更持久的)问题。这个KB article表明.NET 3.5SP1中的WPF存在内存泄漏(您的打印驱动程序可能是客户端)。
如果退避策略不能解决您的问题(如果它在长期过程中是泄漏则可能不会),您可能想尝试应用此修补程序。我,我会在虚拟机中复制问题然后修补它来测试它(但我是一个极端的偏执狂。)
通过Google搜索PresentationCore Insufficient memory to continue the execution of the program
并检查第一个链接here找到了它。在该页面上搜索字符串“与此问题相关的修补程序”。
答案 1 :(得分:1)
在向队列添加新作业之前,您应该检查队列状态。有关PrintQueue.IsOutOfMemory属性和相关属性的更多信息,可以查询以验证队列是否处于错误状态。
当然,pax'提示在访问打印机等资源时使用防御策略是最佳做法。对于初学者,您可能希望将作业添加到try
块中。
答案 2 :(得分:1)
您可能需要考虑启动一个新流程来处理每个文档的打印,与打印文档的工作量相比,开销应该很低。