本帖最后由 leesony 于 2012-03-12 20:42:02 编辑

解决方案 »

  1.   

    http://topic.csdn.net/t/20040512/08/3056877.html
      

  2.   

    道理是一样的,关键是要理解异步投递的模型
    Managed I/O Completion Ports (IOCP)
      

  3.   

    其实C#的很多异步操作已经使用了IO Complemention,你只要简单的BeginReceive/EndReceive就可以了。.Net内部会帮你把IO Complemtion发送到线程池并调用你提供的回调函数。比如下面的代码。
    在实验中保持Server运行,同时运行多次Client,你可以发现.Net并不一定需要多个线程来服务多个客户,在保持快速响应的同时,尽可能复用可用线程(可能最终一个就够了):// Server.cs
    class Server
    {
        static void Main(string[] args)
        {
            TcpListener listener = new TcpListener(IPAddress.Any, 4567);
            listener.Start();
            while (true)
            {
                Socket socket = listener.AcceptSocket();
                StateObject so = new StateObject() { socket = socket };
                so.socket.BeginReceive(so.buffer, so.offset, StateObject.BUFFER_SIZE - so.offset, SocketFlags.None, AsyncCallback, so);
            }
        }
            
        static void AsyncCallback(IAsyncResult ar)
        {
            Console.WriteLine("AsyncCallBack in managed thread " + Thread.CurrentThread.ManagedThreadId);
            StateObject so = ar.AsyncState as StateObject;
            int read = 0;
            try
            {
                read = so.socket.EndReceive(ar);
                so.offset += read;
            }
            catch (SocketException se) 
            {
                Console.WriteLine(se.Message);
            }        if (read == 0)
            {
                string msg = Encoding.UTF8.GetString(so.buffer, 0, so.offset);
                Console.WriteLine(msg);
            }
            else
            {
                so.socket.BeginReceive(so.buffer, so.offset, StateObject.BUFFER_SIZE - so.offset, SocketFlags.None, AsyncCallback, so);
            }
        }    public class StateObject
        {
            public Socket socket = null;
            public const int BUFFER_SIZE = 64*1024;
            public byte[] buffer = new byte[BUFFER_SIZE];
            public int offset = 0;
        }
    }
    // Client.cs
    class Client
    {
        static void Main(string[] args)
        {
            ThreadPool.QueueUserWorkItem(Sender, "Hello world ");
            ThreadPool.QueueUserWorkItem(Sender, "nihao ");
            ThreadPool.QueueUserWorkItem(Sender, "Bonjour ");        Console.ReadLine();
        }    static void Sender(object state)
        {
            TcpClient tcp = new TcpClient("localhost", 4567);
            Random random = new Random( state.GetHashCode() );
            using (NetworkStream stream = tcp.GetStream())
            {
                for (int i = 0; i < 10; i++)
                {
                    byte[] bytes = Encoding.UTF8.GetBytes( state as string);
                    stream.Write(bytes, 0, bytes.Length);
                    Thread.Sleep(random.Next(5 * 1000));
                }
            }
        }
    }
      

  4.   

    请更正我的错别字:)
    IO Completion
      

  5.   

    gomoku大哥,你给这个代码,在服务器端是收数据的,那发数据是怎么发的,再补充下哦
      

  6.   

    Server.cs底下不是有一个client.cs吗?