2009-12-22 3 views
0

Я получаю эту ошибку при печати нескольких .xps документов на физический принтерПакетная печать исключение

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

Документы наматывается успешно до, исключение задания печати возникает

InnerException является Недостаточно памяти для продолжения выполнение программы.

Источник является PresentationCore.dll

Где я должен начать поиск?

ответ

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 для проверки, если все в порядке, а затем попробуйте один, поскольку последний может все еще часто терпеть неудачу, если что-то меняется между проверкой и попыткой. Это называется «лучше просить прощения, чем спрашивать разрешения» метод, который также хорошо работает с боссами большую часть времени, и жен немного реже :-)

Один особенно полезный случай был программа, открыла отдельную TCP-сессию для каждой короткоживущей транзакции. На более старых аппаратных средствах закрытые сокеты (те, в состоянии TCP WAIT) в конечном итоге исчезли, прежде чем они были необходимы снова.

Но, по мере того, как аппаратное обеспечение ускорялось, мы обнаружили, что мы можем открывать сеансы и работать намного быстрее, а Windows заканчивается из ручек TCP (даже при увеличении до max).

Вместо того, чтобы перестроить протокол связи для ведения сеансов, эта стратегия была реализована, чтобы обеспечить изящное восстановление в ручках событий.

Предоставлено, что это немного клочья, но это устаревшее программное обеспечение приближается к концу жизни, где исправления ошибок часто достаточно, чтобы заставить его работать, и он не считался стратегическим, чтобы гарантировать тратить много денег в исправляя его должным образом.


Update: Может быть, что есть (более постоянны) проблема с PresentationCore. В этом KB article указано, что в WPF в .NET 3.5SP1 есть утечка памяти (из которой ваш драйвер печати может быть клиентом).

Если стратегия отсрочки не устраняет вашу проблему (может быть, это не так, как утечка в долговечном процессе), вы можете попробовать применить исправление. Я, я бы реплицировал проблему на виртуальной машине, а затем исправил ее, чтобы проверить ее (но я крайний параноик).

Было найдено по ошибке в поисковых системах PresentationCore Insufficient memory to continue the execution of the program и проверке первой ссылки here. Найдите строку "исправление, относящееся к этой проблеме" на этой странице.

1

Перед добавлением нового задания в очередь вы должны проверить состояние очереди. Дополнительная информация о свойствах PrintQueue.IsOutOfMemory и связанных с ними свойствах, которые могут быть запрошены для проверки того, что очередь не находится в состоянии ошибки.

Конечно, подсказка о том, чтобы использовать защитную стратегию, когда доступ к ресурсам, таким как принтеры, - лучшая практика. Для стартера вы можете поместить линию, добавляющую задание в блок try.

1

Возможно, вы захотите рассмотреть возможность запуска нового процесса для обработки печати каждого документа, накладные расходы должны быть низкими по сравнению с усилиями по печати документов.

Смежные вопросы