3 つの個別のアプリケーションで構成されるシステムを設計しました。
- ウェブアプリケーション
- Web アプリから要求を受け取る WCF サービス アプリケーションは、適切なアクションを実行し、SendKeys クラスを使用して結果を出力し
SendKeys.SendWait("^p");ます (これは、画面に内容を出力する Ctrl + P コマンドを送信します)。 - Console.In を介してプリンター出力 (redmon 経由の仮想プリンター) をインターセプトするコンソール アプリケーション (ここで提案されているように)
WCF サービス アプリと Web アプリケーションは簡単に通信できますが、サービス アプリとコンソール アプリケーションの間に直接的な通信はありません。コンソール アプリは、プリンター ジョブがあり、WCF アプリが印刷ジョブの結果を認識していない場合にのみ開始します。
WCF Service アプリが印刷されたジョブからフィードバックを受信するようにする方法はありますか (問題がないかどうか)、Thread.Sleep()プリンター アプリが印刷を終了して保存するまで毎秒行うことなく、Web アプリケーションに適切な応答を返すことができます。ファイルまたはデータベースになりますか?
印刷プロセスが完了したときに、WCF サービス アプリでスレッドを一時停止し、プリンター コンソール アプリケーションから (情報を送り返しながら) スレッドを再開する方法はありますか?
編集:
Richard Blewett の提案から解決策を見つけることができました。このソリューションでは、印刷ジョブが完了するまで WCF サービス アプリを待機させますが、WCF アプリは一度に 1 つの印刷ジョブのみを作成するように制限されます。
次のように、WCF アプリでいくつかのキーを使用して EventWaitHandle を作成します。
EventWaitHandle ewh = new EventWaitHandle(false, EventResetMode.ManualReset, "unique-key");
WaitHandle.WaitAny(new WaitHandle[] { ewh });
そして、次のようにコンソール アプリからスレッドに戻ることができます。
EventWaitHandle ewh = EventWaitHandle.OpenExisting("unique-key");
ewh.Set();
リチャードのソリューションでは、これは当てはまりません。複数の WCF サービス呼び出しを同時に実行できます。