C# 使用多用户WCF服务打印MS Word文档
我编写了一个WCF打印MS Word文档服务。 此服务由多台PC调用。 打印方法获取MS文档路径(在网络上)和打印机名称(打印机在网络上)作为参数 问题是,当两个用户同时打印时,两个打印的文档可能会在同一台打印机上打印。 原因是我们使用Word Interop定义在何处打印MS文档的方式。使用interop打印word文档时,需要将活动打印机设置为打印机名称。因此,如果两个用户同时打印,则发送打印请求的最后一个用户将更改活动打印机,并导致第一个用户的第一个文档在第二台打印机上打印 按照我写的打印方法:C# 使用多用户WCF服务打印MS Word文档,c#,wcf,printing,ms-word,interop,C#,Wcf,Printing,Ms Word,Interop,我编写了一个WCF打印MS Word文档服务。 此服务由多台PC调用。 打印方法获取MS文档路径(在网络上)和打印机名称(打印机在网络上)作为参数 问题是,当两个用户同时打印时,两个打印的文档可能会在同一台打印机上打印。 原因是我们使用Word Interop定义在何处打印MS文档的方式。使用interop打印word文档时,需要将活动打印机设置为打印机名称。因此,如果两个用户同时打印,则发送打印请求的最后一个用户将更改活动打印机,并导致第一个用户的第一个文档在第二台打印机上打印 按照我写的打印
using wd = Microsoft.Office.Interop.Word;
class WordWrapper
{
private readonly wd.Application _wdApp;
public WordWrapper()
{
_wdApp = new wd.Application();
}
internal void Print(string wordPath, string printerName)
{
int referenceCount;
wd.Documents wdDocuments = null;
wd.Document wdDocument = null;
try
{
wdDocuments = _wdApp.Documents;
wdDocument = wdDocuments.Open(wordPath);
try
{
_wdApp.DisplayAlerts = wd.WdAlertLevel.wdAlertsNone;
_wdApp.ActivePrinter = printerName; // THIS LINE CHANGE THE ACTIVE PRINTER
wdDocument.PrintOut();
}
catch (COMException ex)
{
if (ex.ErrorCode == -2146827284)
{
throw new WordFileOpenException();
}
}
finally
{
_wdApp.DisplayAlerts = wd.WdAlertLevel.wdAlertsAll;
wdDocument.Close(true);
wdDocuments.Close();
}
}
finally
{
referenceCount = ReleaseWordObject(wdDocuments);
}
}
}
问题是:我如何锁定以防止两个用户同时更改活动打印机?您是否阅读了一篇文章,其中有一种方法可以在不更改打印机的情况下执行此操作?是的,但它说如果不更改默认打印机,您将无法打印,正如我在问题中提到的,那么您唯一的选择就是实施一个堆栈-打印请求在堆栈中-这样您就可以更改打印机进行打印,然后启动nextOK,很有趣。你能提供更多的细节吗。所有打印用户如何知道该堆栈,每个用户将从不同的exe应用程序打印。您说过您有一个收集所有打印请求的WCF-您实现该堆栈,对它们进行排队,然后打印它们,以便一次只打印一个。为了简化它,您可能会将打印拆分为一个服务,以便它执行队列,WCF接受请求并验证它需要的所有内容