それぞれが NamedPipeServer (名前付きパイプ IPC 用に .net 3.5 で追加されたマネージド型) を作成し、クライアントの接続 (ブロック) を待機する多数のスレッドを生成するアプリケーションを開始します。コードは意図したとおりに機能します。
private void StartNamedPipeServer()
{
using (NamedPipeServerStream pipeStream =
new NamedPipeServerStream(m_sPipeName, PipeDirection.InOut, m_iMaxInstancesToCreate, PipeTransmissionMode.Message, PipeOptions.None))
{
m_pipeServers.Add(pipeStream);
while (!m_bShutdownRequested)
{
pipeStream.WaitForConnection();
Console.WriteLine("Client connection received by {0}", Thread.CurrentThread.Name);
....
ここで、このプロセスを完全に停止するための Shutdown メソッドも必要です。通常の bool フラグ isShutdownRequested トリックを試しました。ただし、パイプストリームは WaitForConnection() 呼び出しでブロックされたままになり、スレッドは終了しません。
public void Stop()
{
m_bShutdownRequested = true;
for (int i = 0; i < m_iMaxInstancesToCreate; i++)
{
Thread t = m_serverThreads[i];
NamedPipeServerStream pipeStream = m_pipeServers[i];
if (pipeStream != null)
{
if (pipeStream.IsConnected)
pipeStream.Disconnect();
pipeStream.Close();
pipeStream.Dispose();
}
Console.Write("Shutting down {0} ...", t.Name);
t.Join();
Console.WriteLine(" done!");
}
}
Join は決して戻りません。
私が試したことはありませんが、機能する可能性があるオプションは、Thread.Abort を呼び出して例外を処理することです。しかし、それは正しくありません..何か提案があれば
更新 2009-12-22
以前に投稿できなくて申し訳ありません.. これは、キム ハミルトン (BCL チーム) からの返信として受け取ったものです。
割り込み可能な WaitForConnection を行う「正しい」方法は、BeginWaitForConnection を呼び出し、コールバックで新しい接続を処理し、パイプ ストリームを閉じて接続の待機を停止することです。パイプが閉じている場合、EndWaitForConnection は ObjectDisposedException をスローし、コールバック スレッドがこれをキャッチして未解決の端をクリーンアップし、クリーンに終了します。
これはよくある質問であることを認識しているため、私のチームの誰かが近日中にブログを書く予定です。