2

3 つの個別のアプリケーションで構成されるシステムを設計しました。

  1. ウェブアプリケーション
  2. Web アプリから要求を受け取る WCF サービス アプリケーションは、適切なアクションを実行し、SendKeys クラスを使用して結果を出力しSendKeys.SendWait("^p");ます (これは、画面に内容を出力する Ctrl + P コマンドを送信します)。
  3. 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 サービス呼び出しを同時に実行できます。

4

1 に答える 1

1

印刷ジョブに一意の識別子があるとすると、コンソールアプリはWCFサービスを呼び出して、印刷ジョブが正常に完了したか失敗したかを通知できます。

WCFサービスは、完了呼び出しが着信するまでブロックする必要があります(たとえば、ManualResetEventSlimを待機します)。または、印刷ジョブの進行中に要求スレッドをプールに戻すことができるように、サービスを非同期サービスとして書き込む必要があります。 。

印刷ジョブに一意の識別子が必要な理由は、一意のIDをイベントにマッピングするサービスのメモリにデータ構造を保持して、ジョブの完了時に正しい待機要求を通知できるようにする必要があるためです。

WCFサービスは、印刷ジョブを作成するときに、たとえば、印刷ジョブIDを信号のないManualResetEventSlim(印刷ジョブごとに1つ)にマッピングするConcurrentDictionaryにエントリを配置します。次に、イベントが通知するのを待ちます。

これで、印刷ジョブが完了すると、コンソールアプリがWCFサービスを呼び出してprintJobIdを渡します。この操作はディクショナリに対して実行され、イベントを取得して通知します。元の呼び出しは、印刷ジョブが完了したことを認識してウェイクアップします。

印刷ジョブのステータスもこの辞書データ構造を介して渡される可能性があるため、次のようになります。

class PrintJob
{
    public PrintJob()
    { 
        Event = new ManualResetEventSlim();
    }

    public ManualResetEventSlim Event {get; private set;}

    public int Status{ get; set;}
}

ディクショナリは、印刷ジョブごとにprintJobIdをこれらの1つにマップします。操作と呼ばれるコンソールアプリは、ステータスを印刷ジョブの結果に設定します

于 2012-02-07T16:35:07.197 に答える