博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ASP.NET那点不为人知的事(四)
阅读量:6839 次
发布时间:2019-06-26

本文共 1707 字,大约阅读时间需要 5 分钟。

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

接着上篇博客(),基本可以实现一个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 中是怎样实现多线程的。

转载地址:http://eemkl.baihongyu.com/

你可能感兴趣的文章
一辈子不用考试?你可能是个假程序员
查看>>
单选框-复选框重置的方法
查看>>
Confluence 6 "Duplicate Key" 相关问题解决
查看>>
Linux IO多路复用之epoll网络编程(含源码)
查看>>
OTL调用Oracle存储过程
查看>>
【20160924】GOCVHelper MFC增强算法(1)
查看>>
走进JavaWeb技术世界7:Tomcat中的设计模式
查看>>
阅读mutate源码学习dplyr
查看>>
layui upload 额外参数上传
查看>>
我来悟微服务(3)-需求管理
查看>>
fatal error LNK1112: module machine type 'x64' conflicts with target machine type 'X86'
查看>>
SpringBoot-14-MyBatis预热篇,MySQL小结
查看>>
深度学习基础与技巧
查看>>
Firefox 将导入 Windows 根证书,避免与杀毒软件的冲突
查看>>
Windows搭建golang开发平台
查看>>
多线程基础篇(3)——初试锁
查看>>
利用WSS搭建学生作业平台
查看>>
刚进入win7系统就提示检测到一个硬盘问题的解决方法
查看>>
Python之配置日志模块logging
查看>>
指定目录的所有 *.gif 文件都重命名为 *.jpg
查看>>