//这是我的客户端类
    class Client
    {
        Socket _client;
        static Queue<string> Commands = new Queue<string>();        public void ReadCommand()
        {
            while (true)
            {
                NetworkStream stream = new NetworkStream(_client);
                byte[] buffer = new byte[512];
                int i = stream.Read(buffer, 0, buffer.Length);
                Commands.Enqueue(Encoding.Unicode.GetString(buffer, 0, i));            }        }    }//这是主程序
class a
    {
        static List<Client> _clients = new List<Client>();
        static Socket _server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);        static void Main()
        {
            _server.Bind(new IPEndPoint(IPAddress.Parse("172.0.0.0"), 5000));
            while (true)
            {
                Client clt=new Client(_server.Accept());
                _clients.Add(clt);
                ThreadPool.QueueUserWorkItem(clt.ReadCommand);
            }        }
    }我本来想用线程池的  可是在MSDN上看见上面说
      在以下几种情况下,适合于创建并管理自己的线程而不是使用线程池线程:       1.需要前台线程。      2.需要使线程具有特定的优先级。      3.您的任务会导致线程长时间被阻塞。由于线程池具有最大线程数限制,因此大量阻塞的线程池线程可能会阻止任务启动。      4.需要将线程放入单线程单元。所有 ThreadPool 线程均处于多线程单元中。      5.您需要具有与线程关联的稳定标识,或使某一线程专用于某一任务。
上面第3条说任务如果可能被长时间阻塞 不应用线程池  我的那句 int i = stream.Read(buffer, 0, buffer.Length);
就可能会长时间阻塞 应不应该用线程池呢? 如果不用就得每个Client对象都私有一个Thread会不会影响性能呢?(我要连60多个Client)

解决方案 »

  1.   

    其实你可以:
    1,掂量一下你那线程的任务持续时间是否很长,如果很短的话,可以考虑用线程池;
    2,你的socket是否短连接,如果是短连接,可以考虑用线程池;
    3,如果你不用对产生的各个线程进行控制的话,也可以考虑用线程池。如果就你上面的代码看,buffer不超过10*M(1024K)级的话,是用线程池好点的。
      

  2.   


    stream.Read就算“长时间阻塞”啊?正常情况下它阻塞多久?没有超过1秒钟吧!而长时间阻塞是指正常情况下也要及时秒钟才能执行完。不过所有stream其实都支持异步Read。更甚,其实TcpListener类的异步Accept以及NetworkStream的异步Read/Write机制完美地封装了windows的IO完全接口技术,你使用.net来发开发服务器端时为什么还要用同步阻塞方法?
      

  3.   

    在编写服务器端的时候,不需要出现Thread,同时也不需要出现ThreadPool。异步的Accept,异步的Read,很简洁也很高效。该用多少线程,该如何优化,自有.net不断更新实现。
      

  4.   

    另外,你的            while (true)
                {
                    NetworkStream stream = new NetworkStream(_client);
                    byte[] buffer = new byte[512];
                    int i = stream.Read(buffer, 0, buffer.Length);
                    Commands.Enqueue(Encoding.Unicode.GetString(buffer, 0, i));            }
    这类代码对我来说是挺恐怖的事情。就算你使用线程,也不应该在线程执行的程序中弄一个循环啊!这从习惯性思路上我就无法忍受。当你不知道客户端多久会发送一个消息的时候,怎么能随随便便就让线程不立刻结束而是去(内部)循环呢?
      

  5.   


    = =  就算我用错词.. 我就是个新手.. 一名17岁高中生而已.. 仅仅想在CSDN上寻求一个问题的答案.. 劳烦您给个比较详细一点的做法(这个词可以吧)行吗?