Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用多用户WCF服务打印MS Word文档_C#_Wcf_Printing_Ms Word_Interop - Fatal编程技术网

C# 使用多用户WCF服务打印MS 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文档时,需要将活动打印机设置为打印机名称。因此,如果两个用户同时打印,则发送打印请求的最后一个用户将更改活动打印机,并导致第一个用户的第一个文档在第二台打印机上打印 按照我写的打印

我编写了一个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接受请求并验证它需要的所有内容