3

多数のスレーブ プロセスを開始する Windows サービスを作成しています。これらのスレーブ プロセスのそれぞれで、マスター プロセスからのメッセージを名前付きパイプでリッスンし始めます。

現在、スレーブが完全に起動して名前付きパイプでリッスンを開始する前に、マスタープロセスが名前付きパイプを介してスレーブを呼び出す状況があります。

    ProcessStartInfo processStartInfo = new ProcessStartInfo("slave");
    processStartInfo.Arguments = Address 

    Process process = new Process();
    process.StartInfo = processStartInfo;

    process.Start();

    base.Endpoint.Binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None);
    base.Endpoint.Address = Address;

    base.Channel.RemoteMethod();

これを行うと、チャネルが入り、チャネルCommunicationState.Faultedでの後続の呼び出しも失敗します。

スレーブ プロセスがリッスンを開始したことをマスターから確認するにはどうすればよいですか? CommunicationState.Faultedまたは、 から回復してリモート コールを再試行するにはどうすればよいですか?

4

3 に答える 3

1

障害状態から回復する唯一の方法は、インスタンスを再構築してOpen()メソッドを呼び出すことにより、WCFクライアントを再初期化することです。

一般に、サービスを呼び出す前に、常にStatusプロパティを確認し、Openedでない場合は、上記のように再初期化を試みます。失敗した場合は、サーバーに問題があります。(私の場合、非アクティブのために状態に障害が発生するため、通常、初期化は成功します)

于 2009-07-03T07:05:14.183 に答える
0

ホストの「ServiceFaulted」イベントにアタッチし、これを使用してエラー処理を実行できます。ドキュメントによると、正しいアクションはホストを中止することです。その後、再初期化を試みることができますが、システムがダウンしている場合は無駄になる可能性があります。

于 2009-07-03T07:08:21.997 に答える
0

おそらく、「セッション」ベースのサービスを実装できます。したがって、クライアントは WCF チャネルを開き、セッションを開くための呼び出しを行います (例: "open" 呼び出し)。これにより、スレーブがリッスンしていることをホストに知らせることができます。

WCF のコールバック メカニズムを調べて、スレーブが初期化された後に行われた "open" 呼び出しからのコールバックを介してスレーブへのリモート通信が提供されるようにすることをお勧めします。

新しいインスタンスを作成したいという Alex Drenea の言葉は正しいです。プロキシを作成するには、WCF の ChannelFactory クラスを参照することをお勧めします。これをいくつかの try catch タイプの動作で使用して、スレーブの初期起動を処理できます。スレーブ プロセスで例外が表示されないように、デバッガーがアタッチされない可能性があるため、スレーブ プロセスのスタートアップ コードに System.Diagnostics.Debugger.Break() を配置することもできます。

プロセスの分離が本当に必要なのか、それとも同期とスレッドを使用するだけで十分でしょうか?

于 2009-07-03T08:47:28.270 に答える