ASP.NET那点不为人知的事(四)
ASP.NET那点不为人知的事(四)
木宛城主 发表于3年前
ASP.NET那点不为人知的事(四)
  • 发表于 3年前
  • 阅读 1
  • 收藏 0
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

虽然开发中很少接触多线程,但你必须承认你离不开他。

接着上篇博客(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 中是怎样实现多线程的。

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 1
博文 222
码字总数 199010
×
木宛城主
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: