2

1-多くのクライアントにタスク(リロード)を実行するように通知する必要があります。サーバーは、特定の時点で実行されている場合と実行されていない場合があります。(このため、誰がクライアントで誰がサーバーであるかを定義するのに苦労しました。)

サーバーはいつでも実行を開始できます。サーバーが自動的に閉じると、サーバーはすべてのクライアントにタスクを実行するように通知します。

NamedPipeServerStream「クライアント」で複数のインスタンスを使用して実行してみました(関係が奇妙であることを忘れないでください。我慢してください)。残念ながら、特定のサーバー名に対して作成できるパイプサーバーは1つだけです。したがって、これは機能しませんでした。クライアントにサーバーを継続的にチェックさせることもできますが、ポーリングを開始する場合は、DBを直接ポーリングすることをお勧めします。

私の状況はおおよそオブザーバーパターンのようなものです。動的にサブスクライブ/サブスクライブ解除する必要はありません。サーバーがタスクを実行するために実行中のすべてのクライアントに通知をプッシュするようにしたいのですが。

どうすればこれを達成できますか?私はIPCでこれをしなければならないことを覚えておいてください。サーバー/クライアントは異なるプロセスで実行され、常に同じマシン上で実行されます。

4

3 に答える 3

3

ポーリングの問題を解決するために、クライアントプロセスがリッスンする名前付きManualResetEventを作成できます。クライアントはスレッドを起動してイベントを待機します。サーバーが起動すると、イベントが通知され、すべてのクライアントが現在のように名前付きパイプを開くことができるリスニングコードを開始します。Named ManualResetEventを作成する方法の例については、EventWaitHandle.GetAccessControlMSDNページを参照してください。

あなたのI can only create one Pipe server for any given server name.問題では、複数のサーバーが実行されている場合、クライアントはどのサーバーに接続するかをどのように知る必要がありますか?サーバーとクライアントの関係は1つだとおっしゃいました。複数のサーバーを実行する場合は、どのサーバーをリッスンする必要があるかをクライアントに通知する方法が必要になります。

于 2012-02-17T15:32:10.757 に答える
1

プロセスがすべて同じマシン上にあることが保証されていることを指定したので、おそらくeventという名前のウィンドウを使用することを検討します。クライアントとサーバーはOpenEventを呼び出すことができます。イベントが作成されていない場合は、CreateEventを呼び出します。これにより、イベントごとに解放されるクライアントの数を(pulseevent、set / resetなどを使用して)ある程度制御でき、サーバーがまだ存在しない状態でクライアントを開くこともできます。

スコットが示唆しているように、c#でこれを簡単に行うには、文字列を受け取るコンストラクター(このような)を呼び出して、という名前の.netを使用EventWaitHandleます。これにより、システム全体の同期オブジェクトが作成されます。その特定のコンストラクターは、あなたが最初にイベントを要求したのか(それを作成したのか)、それともすでに存在していたのかを教えてくれます。

于 2012-02-17T15:33:37.140 に答える
0

名前付き共有メモリを使用することは、1対多の通信を実現する1つの方法です。サーバーは共有メモリを作成でき、1つ以上のクライアントが共有メモリを開いて読み取ることができます。 例(C)をここに示します。さらに、.NETの例をここに示します

共有メモリは、少なくとも1つのプロセスが開いているハンドルを持っている限り存在します。OPからは、サーバープロセスが閉じられた後も(少なくとも1つのクライアントがまだ開いている限り)メモリが存在し続けることができるため、これは便利な機能のように聞こえます。.NETの例は、情報を永続化する方法も示しています。これは、プロセスよりも長持ちする必要がある場合に役立ちます。

必要なタイミングに応じて、クライアントは必要な情報のために定期的にメモリを読み取ることができます。または、よりタイムクリティカルな状況が存在する場合は、名前付きセマフォを使用して、クライアントに必要な操作を実行するように通知できます。同期オブジェクトとしてセマフォを使用すると、リリースカウントを1より大きい値に設定することで、複数のクライアントに信号を送ることができます。

于 2012-02-17T15:29:09.400 に答える