Eu tropecei nesse problema. No meu caso de uso, eu tinha um script que iterava todos os arquivos em um diretório e invocava o verbo "Imprimir" usando o ShellExecute. (Então, simulando o usuário passando por cada um, clicando com o botão direito e escolhendo "imprimir".)
Os resultados são bons quando você está trabalhando apenas com um pequeno número de documentos, mas com 10 ou 100, há sempre alguns que estão fora de ordem.
É difícil dizer se o problema está no programa que está lidando com o verbo "print" ou com a própria fila. (No meu caso, toda vez que estou invocando impressão, provavelmente estou invocando uma nova instância do programa usado para impressão. Isso significa que os caprichos do tempo / programação de execução podem significar que o programa "imprimir" do documento nº 2 realmente envia trabalho para a fila antes do documento # 1.)
Parece que pode haver algo acontecendo com a fila também.
Eu criei um programa que imprime documentos enquanto assisto a fila. A primeira versão funcionou da seguinte maneira:
- ShellExecuteEx para imprimir documento
- Aguarde o documento ser exibido no printqueue
- Imprimir próximo documento
Nesta versão, alguns documentos ainda seriam impressos fora de ordem. A segunda versão foi a que funcionou:
- ShellExecuteEx para imprimir documento
- Aguarde o documento ser exibido no printqueue
- Aguarde a conclusão do spool (PrintSystemJobInfo.IsSpooling == status falso no .NET)
- Imprimir próximo documento
Esta segunda versão imprime os documentos sempre em ordem. Isso me leva a acreditar que quando você está enviando um monte de documentos, há um período estranho em que é uma corrida para ver qual deles é colocado em spool primeiro.
Não estou familiarizado com os detalhes do sistema de impressão do Windows. Pode ser que um trabalho apareça antes que o programa que o gera seja enviado enviando todos os dados. Isso significaria que o tempo de execução variável do programa por trás do verbo "imprimir" poderia estar causando o problema.