我设计了一个系统,由三个独立的应用程序组成:
SendKeys.SendWait("^p");打印结果(这将发送一个Ctrl +P命令,在屏幕上打印什么内容)。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服务调用。
发布于 2012-02-07 16:35:07
假设打印作业有一个唯一的标识符,那么控制台应用程序可以调用WCF服务来表示打印作业已经完成、确定或失败。
WCF服务要么必须阻塞直到完成调用进来(例如等待一个ManualResetEventSlim),要么您必须将服务写成一个异步服务,以便在打印作业进行时请求线程可以返回到池中。
打印作业需要唯一标识符的原因是,您必须在服务中保存数据结构,将唯一id映射为事件,以便在任务完成时发出正确的等待请求信号。
当WCF服务创建一个打印作业时,它将一个条目放入其中,例如,将ConcurrentDictionary映射printJobId到一个无信号的ManualResetEventSlim (每个打印作业一个)。然后,它等待事件发出信号。
现在,当打印作业完成后,控制台应用程序依次调用传递其printJobId的WCF服务。此操作会对字典进行处理,抓取事件并发出信号。最初的调用现在醒来,知道打印工作已经完成。
打印作业的状态也可以通过这个字典数据结构传递,这样您就可以得到以下内容
class PrintJob
{
public PrintJob()
{
Event = new ManualResetEventSlim();
}
public ManualResetEventSlim Event {get; private set;}
public int Status{ get; set;}
}字典会为每个打印作业将printJobId映射到其中之一。名为操作的控制台应用程序将将状态设置为打印作业的结果。
https://stackoverflow.com/questions/9179658
复制相似问题