private void Form1_Load(object sender, EventArgs e) { // 演示设置serer属性 // 缓冲区大小应根据实际业务设置, 并发数和包大小都是考虑条件 // 都是小包的情况下4K合适, 刚好是一个内存分页(在非托管内存, 相关知识查百度) // 大包比较多的情况下, 应根据并发数设置比较大但是又不会爆内存的值 _server.SocketBufferSize = 4096; // 4K // serer绑定地址和端口 _server.Address = "0.0.0.0"; _server.Port = 5555; // 演示绑定事件 _server.OnPrepareListen += OnPrepareListen; _server.OnAccept += OnAccept; _server.OnReceive += OnReceive; _server.OnClose += OnClose; _server.OnShutdown += OnShutdown; // 线程池相关设置 // 线程池回调函数 _taskTaskProc = TaskTaskProc; // 定时输出线程池任务数 _timer.Elapsed += (_, args) => { if (_server.HasStarted && _threadPool.HasStarted) { AddLog($"线程池当前在执行的任务数: {_threadPool.TaskCount}, 任务队列数: {_threadPool.QueueSize}"); } }; _timer.Start(); }
private void Form1_Load(object sender, EventArgs e) { // 演示设置serer属性 // 缓冲区大小应根据实际业务设置, 并发数和包大小都是考虑条件 // 都是小包的情况下4K合适, 刚好是一个内存分页(在非托管内存, 相关知识查百度) // 大包比较多的情况下, 应根据并发数设置比较大但是又不会爆内存的值 _server.SocketBufferSize = 4096; // 4K // serer绑定地址和端口 _server.Address = "0.0.0.0"; _server.Port = 5555; // ssl 证书加载 // ReSharper disable once BitwiseOperatorOnEnumWithoutFlags _server.VerifyMode = SslVerifyMode.Peer | SslVerifyMode.FailIfNoPeerCert; // 单向验证或客户端可选 _server.CaPemCertFileOrPath = "ssl-cert\\ca.crt"; _server.PemCertFile = "ssl-cert\\server.cer"; _server.PemKeyFile = "ssl-cert\\server.key"; _server.KeyPassword = "******"; // 初始化ssl环境, 参数false表示从文件加载证书, 如果为true, 应该把证书读到内存 // 例如, 证书是数据库里读入进来的文本数据, 此处为true if (!_server.Initialize(false)) { AddLog("ssl环境初始化失败, 请检查证书是否存在, 证书密码是否正确"); return; } // 演示绑定事件 _server.OnPrepareListen += OnPrepareListen; _server.OnAccept += OnAccept; // ssl server 还应该绑定握手事件, 该事件到达说明两端握手成功, OnAccept只能说明连接进入了, 还没握手 _server.OnHandShake += OnHandShake; _server.OnReceive += OnReceive; _server.OnClose += OnClose; _server.OnShutdown += OnShutdown; // 线程池相关设置 // 线程池回调函数 _taskTaskProc = TaskTaskProc; // 定时输出线程池任务数 _timer.Elapsed += (_, args) => { if (_server.HasStarted && _threadPool.HasStarted) { AddLog($"线程池当前在执行的任务数: {_threadPool.TaskCount}, 任务队列数: {_threadPool.QueueSize}"); } }; _timer.Start(); }
///// <summary> ///// 向线程池提交异步任务 ///// </summary> ///// <param name="taskProc">任务处理函数</param> ///// <param name="args">任务参数</param> ///// <param name="maxWait">最大等待时间(毫秒,默认:INFINITE即-1,一直等待)</param> ///// <returns>true: 成功, false: 失败,可通过 ErrorCode 属性 获取系统错误代码,其中,错误码 ERROR_DESTINATION_ELEMENT_FULL 表示任务队列已满</returns> //public bool Submit(TaskProc taskProc, IntPtr args, int maxWait = -1) => Sdk.ThreadPool.HP_ThreadPool_Submit(_pool, taskProc, args, maxWait); /// <summary> /// 向线程池提交异步任务 /// </summary> /// <param name="taskProc">任务处理函数</param> /// <param name="obj">任务参数</param> /// <param name="maxWait">最大等待时间(毫秒,默认:INFINITE即-1,一直等待)</param> /// <returns>true: 成功, false: 失败,可通过 ErrorCode 属性 获取系统错误代码,其中,错误码 ERROR_DESTINATION_ELEMENT_FULL 表示任务队列已满</returns> public bool Submit(TaskProcEx taskProc, object obj, int maxWait = -1) { var guid = Guid.NewGuid().ToString("N"); var args = new ThreadProcExArgs { Arg = obj, TaskProc = taskProc, }; if (!_extraData.Set(guid, args)) { return(false); } var bytes = Encoding.ASCII.GetBytes(guid); var gch = GCHandle.Alloc(bytes, GCHandleType.Pinned); return(Sdk.ThreadPool.HP_ThreadPool_Submit(_pool, _taskProc, (IntPtr)gch, maxWait)); }