ASP.NET那点不为人知的事(四)
虽然开发中很少接触多线程,但你必须承认你离不开他。
接着上篇博客(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 中是怎样实现多线程的。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~