我设计了一个由 3 个独立的应用程序组成的系统:
- Web应用程序
- WCF 服务应用程序接收来自 Web 应用程序的请求,执行适当的操作并使用 SendKeys 类打印结果
SendKeys.SendWait("^p");
(这会发送一个 Ctrl + P 命令来打印屏幕上的内容)。 - 通过 Console.In 拦截打印机输出(通过 redmon 的虚拟打印机)的控制台应用程序(如此处所建议的)
WCF 服务应用程序和 Web 应用程序可以轻松通信,但服务应用程序和控制台应用程序之间没有直接通信。控制台应用程序仅在有打印机作业且 WCF 应用程序不知道打印作业的结果时启动。
有没有办法让 WCF 服务应用程序接收来自打印作业的反馈(无论是否正常),因此它可以将适当的响应发送回 Web 应用程序,而无需Thread.Sleep()
每秒执行一次,直到打印机应用程序完成打印并保存结果是文件还是数据库?
有没有办法我可以暂停 WCF 服务应用程序中的线程,并在打印过程完成后从打印机控制台应用程序恢复它(同时发送回信息)?
编辑:
我设法从 Richard Blewett 的建议中找到了解决方案。该解决方案将使 WCF 服务应用程序等到打印作业完成,但它会导致 WCF 应用程序被限制为一次只能制作一个打印作业。
我在 WCF 应用程序中创建了一个带有一些键的 EventWaitHandle,如下所示:
EventWaitHandle ewh = new EventWaitHandle(false, EventResetMode.ManualReset, "unique-key");
WaitHandle.WaitAny(new WaitHandle[] { ewh });
我可以像这样从控制台应用程序返回线程:
EventWaitHandle ewh = EventWaitHandle.OpenExisting("unique-key");
ewh.Set();
使用 Richard 的解决方案就不会出现这种情况,并且可以同时进行多个 WCF 服务调用。