0

着信接続ごとに新しいスレッドを生成することになっているマルチスレッドサーバーを構築しようとしていますが、すべての努力のために、それはそれが好きだと感じたときにのみ新しいスレッドを生成します、誰かがこのコードをデバッグするのを手伝ってくれますか?明らかな何かが欠けていますか?

 while (true)
 {
   if (txtAddress.Text.Trim() == "Any" || txtAddress.Text.Trim() == "any")
      ipEndP = new IPEndPoint(IPAddress.Any, 778);
   else
      ipEndP = new IPEndPoint(IPAddress.Parse(txtAddress.Text.Trim()), 778);

      tcpL = new TcpListener(ipEndP);
      tcpL.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);

      tcpL.Start();
      tempSock = tcpL.AcceptSocket();

 //t = new Thread(ConnectionHandler); //When new client is connected, new thread       //is created to handle the connection
 //t.Priority = ThreadPriority.Highest;
 //t.Start(tempSock);

 ThreadPool.QueueUserWorkItem(ConnectionHandler, tempSock);
 }
4

1 に答える 1

4

QueueUserWorkItemのMSDNドキュメントを確認してください

実行のためにメソッドをキューに入れます。このメソッドは、スレッドプールスレッドが使用可能になると実行されます。

ユーザーの作業項目キューにスレッドを配置しても、スレッドがすぐに実行を開始することは保証されません。それは実際には良いことです。数百または数千のスレッドが必要になるほど多くの接続を取得した場合、サーバーを簡単にひざまずく可能性があります(また、過度のコンテキストスイッチのために非常に無駄になります)。

コメントアウトされたコードは、接続ごとに新しいスレッドを開始する必要があります。それは機能していませんか?もしそうなら、正確に何が機能していないのですか?接続ごとに新しいスレッドを作成することは、スレッドプールを使用するよりもはるかにコストがかかることに注意してください。

アップデート

コメントアウトされたコードもあまりにも多くのスレッドを作成できていないというあなたの意見に基づいて、私は追加します...

それが起こった場合、あなたはあまりにも多くのスレッドを作成しています。

プロセスで約2000を超えるスレッドを作成できない理由を尋ねる人がよくいます。その理由は、Windowsに固有の特定の制限があるということではありません。むしろ、プログラマーは各スレッドが使用するアドレス空間の量を考慮に入れていませんでした。

A thread consists of some memory in kernel mode (kernel stacks and object management), some memory in user mode (the thread environment block, thread-local storage, that sort of thing), plus its stack. (Or stacks if you're on an Itanium system.)

Usually, the limiting factor is the stack size.

http://blogs.msdn.com/b/oldnewthing/archive/2005/07/29/444912.aspx

于 2012-08-09T02:24:06.110 に答える