C# 通过Word Interop打印的文档立即从打印队列中消失

C# 通过Word Interop打印的文档立即从打印队列中消失,c#,winforms,printing,ms-word,office-interop,C#,Winforms,Printing,Ms Word,Office Interop,我有一个C#WinForm应用程序,它通过在书签处放置文本来打开并填写MS Word dotx模板,然后尝试打印它,所有这些都使用MS Word Interop 15 一切正常,打印对话框显示并完成OK,打印作业显示在打印队列中(即MS Windows 10上的“设备和打印机”中的“查看打印内容”窗口)。但是,作业会在后台处理之前立即从队列中消失!(文档在“假脱机”状态下非常短暂地显示,并且不打印-打印机从未获得作业) 以下是我的代码(为了简洁起见,删除了异常检查): 我能想到的唯一一件事是,可

我有一个C#WinForm应用程序,它通过在书签处放置文本来打开并填写MS Word dotx模板,然后尝试打印它,所有这些都使用MS Word Interop 15

一切正常,打印对话框显示并完成OK,打印作业显示在打印队列中(即MS Windows 10上的“设备和打印机”中的“查看打印内容”窗口)。但是,作业会在后台处理之前立即从队列中消失!(文档在“假脱机”状态下非常短暂地显示,并且不打印-打印机从未获得作业)

以下是我的代码(为了简洁起见,删除了异常检查):

我能想到的唯一一件事是,可能是因为我在将文档发送到打印机后立即删除了文档,然后作业还没有完全发送,所以它会删除自身或其他内容。如果是这种情况,那么我如何确定需要将文档保存多长时间,以及等待的最佳方式是什么


编辑:我做了另一点研究(目前没有时间详细介绍),这表明我可能可以使用PrintEnd事件,但我无法立即确定这在使用Interop时是否适用。这是一种不用轮询就能实现我想要的功能的方法吗?

一种解决方案是轮询Word应用程序的属性。它包含仍在打印队列中等待的文档计数。虽然此计数大于0,但仍有文档等待打印

有很多方法可以做到这一点。下面是一个阻止UI的简单循环:

// Send document to printing queue here...

while (wordApp.BackgroundPrintingStatus > 0)
{
    // Thread.Sleep(500);
}

// Printing finished, continue with logic
或者,您可能希望将其包装在任务中,以便在等待时可以执行其他操作:

await Task.Run(async () => { while (wordApp.BackgroundPrintingStatus > 0) 
                                   { await Task.Delay(500); } });

您可以轮询wordApp.BackgroundPrintingStatus的计数,并等待其为0。我无法对此进行测试以验证,所以只需一条注释。@Equalsk我最终使用了您建议的方法(尽管我不喜欢轮询…我想我可以在单独的线程上进行)。无论如何,如果你想回答同样的问题,我会接受的。
await Task.Run(async () => { while (wordApp.BackgroundPrintingStatus > 0) 
                                   { await Task.Delay(500); } });