3

ここに新しいメンバー。このようなきちんとしたコミュニティを見ることができてうれしいです。

少し調査した後、アプリケーションで WCF を使用してプロセス間通信を行うことにしたので、NetNamedPipeBinding バインディングを使用しています。

ServiceHost ホスティング アプリケーションは専用サーバーではないため、スレッドを介して ServiceHost を生成する必要があります。ここまでは順調ですね。

だから私は次のようなものを持っています:

Foo()
{
    Thread serverThread = new Thread(new ThreadStart(ServerThread));
    serverThread.Start();
    Console.WriteLine("Foo Exited");
}

ServerThread()
{
   Uri baseAddress = new Uri("net.pipe://localhost/service");
   ServiceHost serviceHost = new ServiceHost(typeof(MyService), baseAddress);
   ...
   serviceHost.Open();
   Console.WriteLine("Server Thread Exited");
}

予想通り、次のように表示されます。

->   Server Thread Exited
->   Foo Exited

しかし驚いたことに、サーバーが実行されているスレッドが興奮していても、クライアントは引き続き serviceHost に接続でき、サービス ホストはリクエストを適切に処理します。

では、メイン スレッド (作成されたスレッド) が停止しているにもかかわらず、ServiceHost がまだリクエストを処理および処理しているのはなぜでしょうか?

また、ServerThread を存続させ、while(true){Thread. スリープ(100);}?

ありがとう。

4

1 に答える 1

14

ServiceHost で Open を呼び出すと、着信サービス要求をリッスンするための追加のスレッドが作成されます。この方法では、スレッドの実行が終了しても、別のスレッドが作成され、ServiceHost で "Close" を呼び出すまで実行が継続されます。

あなたの場合、自分でスレッドを生成する必要はないかもしれません。アプリケーションのメイン スレッドで ServiceHost を開くだけです。その後、メイン スレッドで他のことを行うことができます。ホストを強制終了する準備ができたら、serviceHost.Close() を呼び出すだけです。

ここに私が見つけたかなり良い説明があります:

http://www.code-magazine.com/article.aspx?quickid=0701041&page=1

于 2009-05-31T19:55:18.583 に答える