文章目錄
雖然開發中很少接觸多線程,但你必須承認你離不開他。
接著上篇部落格(ASP.NET那點不為人知的事(三)),基本可以實現一個Mini版的伺服器,但也有不足:
倘若用戶端飛快地串連,服務端很快被壓垮。
幸好,Socket類實現了.NET架構的非同步呼叫模式,使用這個模式,利用線程池就可以讓伺服器更好的服務於到來的請求。
重構後的版本:
class Program { private const int ConnectionQueueLength = 4; private const int ListenPort = 1234; private const int MaxConnectionHandlers = 4; static void HandleConnection(IAsyncResult ar) { //AsyncResult asyncResult = (AsyncResult) ar; Socket listener=(Socket)ar.AsyncState; Socket newConnectin = listener.EndAccept(ar); byte[] msg = Encoding.UTF8.GetBytes("Hello World"); newConnectin.BeginSend(msg, 0, msg.Length, SocketFlags.None, new AsyncCallback(Program.CloseConnection), newConnectin); } static void CloseConnection(IAsyncResult ar) { Socket socket = ar.AsyncState as Socket; if (socket!=null) { socket.Close(); } } static void Main(string[] args) { Socket listenSocket=new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp); listenSocket.Bind(new IPEndPoint(IPAddress.Any,ListenPort)); listenSocket.Listen(ConnectionQueueLength); for (int i = 0; i < MaxConnectionHandlers; i++) { listenSocket.BeginAccept(new AsyncCallback(Program.HandleConnection), listenSocket); } Console.ReadKey(); } }
這樣我們的伺服器更加有效率,他從線程池中發送資料回去。
注意這兒的非同步呼叫(new AsyncCallback(Program.CloseConnection))使用了一個關閉串連的回調方法,因為為了讓伺服器更加高效,讓偵聽線程在EndSend等待是沒有任何意義的,因為它將堵塞當前線程。
總結
伺服器階段就結束了,相信你也對他有一定的瞭解了,接下來會再講講ASP.NET 中是怎樣實現多線程的。