批量打印例外

时间:2009-12-22 12:16:29

标签: vb.net printing memory-leaks xps

将多个.xps文档打印到物理打印机时出现此错误

Dim defaultPrintQueue As PrintQueue = GetForwardPrintQueue(My.Settings.SelectedPrinter)
Dim xpsPrintJob As PrintSystemJobInfo
xpsPrintJob = defaultPrintQueue.AddJob(JobName, Document, False)

文档被成功假脱机,直到发生打印作业异常

InnerException是内存不足,无法继续执行程序。

源是PresentationCore.dll

我应该从哪里开始搜索?

3 个答案:

答案 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)

您可能需要考虑启动一个新流程来处理每个文档的打印,与打印文档的工作量相比,开销应该很低。