首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何异步等待来自拦截打印机输出的外部应用程序的响应

如何异步等待来自拦截打印机输出的外部应用程序的响应
EN

Stack Overflow用户
提问于 2012-02-07 16:11:03
回答 1查看 959关注 0票数 2

我设计了一个系统,由三个独立的应用程序组成:

  1. Web应用
  2. WCF应用程序接收来自web应用程序的请求,执行适当的操作并使用SendKeys类SendKeys.SendWait("^p");打印结果(这将发送一个Ctrl +P命令,在屏幕上打印什么内容)。
  3. 通过Console.In截取打印机输出(通过redmon的虚拟打印机)的控制台应用程序(如建议的这里 )

WCF服务应用程序和Web应用程序可以很容易地进行通信,但是服务应用程序和控制台应用程序之间没有直接通信。控制台应用程序只在有打印机作业时启动,而WCF应用程序不知道打印作业的结果。

有没有办法让WCF应用程序接收打印作业的反馈(不管是否正常),这样它就可以向web应用程序发送适当的响应,而无需每秒钟执行Thread.Sleep()操作,直到打印机应用程序完成打印并将结果保存在文件或数据库中?

有没有一种方法可以暂停WCF服务应用程序中的线程,并在打印过程完成时从打印机控制台应用程序恢复它(同时发送信息)?

编辑:

我设法从Richard Blewett的建议中找到了解决办法。该解决方案将使WCF服务应用程序等待直到打印作业完成为止,但它将导致WCF应用程序一次只能做一个打印作业。

我在WCF应用程序中创建了一个带有一些键的EventWaitHandle,如下所示:

代码语言:javascript
复制
EventWaitHandle ewh = new EventWaitHandle(false, EventResetMode.ManualReset, "unique-key");
WaitHandle.WaitAny(new WaitHandle[] { ewh });

我可以从控制台应用程序返回到线程,如下所示:

代码语言:javascript
复制
EventWaitHandle ewh = EventWaitHandle.OpenExisting("unique-key");
ewh.Set();

对于Richard的解决方案,情况并非如此,可以同时执行多个WCF服务调用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-07 16:35:07

假设打印作业有一个唯一的标识符,那么控制台应用程序可以调用WCF服务来表示打印作业已经完成、确定或失败。

WCF服务要么必须阻塞直到完成调用进来(例如等待一个ManualResetEventSlim),要么您必须将服务写成一个异步服务,以便在打印作业进行时请求线程可以返回到池中。

打印作业需要唯一标识符的原因是,您必须在服务中保存数据结构,将唯一id映射为事件,以便在任务完成时发出正确的等待请求信号。

当WCF服务创建一个打印作业时,它将一个条目放入其中,例如,将ConcurrentDictionary映射printJobId到一个无信号的ManualResetEventSlim (每个打印作业一个)。然后,它等待事件发出信号。

现在,当打印作业完成后,控制台应用程序依次调用传递其printJobId的WCF服务。此操作会对字典进行处理,抓取事件并发出信号。最初的调用现在醒来,知道打印工作已经完成。

打印作业的状态也可以通过这个字典数据结构传递,这样您就可以得到以下内容

代码语言:javascript
复制
class PrintJob
{
    public PrintJob()
    { 
        Event = new ManualResetEventSlim();
    }

    public ManualResetEventSlim Event {get; private set;}

    public int Status{ get; set;}
}

字典会为每个打印作业将printJobId映射到其中之一。名为操作的控制台应用程序将将状态设置为打印作业的结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9179658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档