Task.Run存在多个任务使用同一线程的情况
在做采集项目时多个socket客户端使用相同线程的情况。具体代码如下
定义一个定时器专门用于创建任务发送socket消息

private void _timeEvnet_TimeEvent() { if (!_beatExecing ) { if ((DateTime.Now - _lastExecTime).TotalMilliseconds >= _execInterval) { _lastExecTime = DateTime.Now; _beatExecing = true; Task.Run(async () => { try { await Exec(); } catch (Exception ex) { } finally { //执行完成 _beatExecing = false; } }); } else { //执行时间未到 } } else { } }

_logger.LogWarning($"当前线程: {name} ----------------{_tcpOption.Ip},{_tcpOption.Port} 发送线程进入 {DateTime.Now.ToString("yyyy - MM - dd HH: mm:ss-fff")}"); //产生通信解除告警 AlarmHandler(false); _totalConnectFailTime = 0; _index = 0;//从开始位置发送数据 while (isExec) { var (startAddr, sendCount) = GetSendInfo(_index); if (sendCount > 0) { var byteStartAddr = BitConverter.GetBytes(startAddr); byteStartAddr = byteStartAddr.Reverse().ToArray(); var sendDatas = _protocolFactorty.GetRequest(_tcpOption.SampleAddr, byteStartAddr, sendCount); _sendCount = sendCount;//记录发送的个数 Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); string abc1 = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss-fff"); _logger.LogError($"当前线程: {name} {_tcpOption.Ip},{_tcpOption.Port} 发送数据----- {_sendCount} {abc1}"); await _netSocketTcpClient.SendDatas(sendDatas); if (!_auto.WaitOne(2000))//等待3秒没有收到数据,如果出现连续3次没有收到数据,就认为设备出现问题,强制重连 { stopwatch.Stop(); string abc2 = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss-fff"); _logger.LogError($"{_tcpOption.Ip},{_tcpOption.Port} 超过3秒没有收到回复消息8888********** {abc2}"); //没有收到设备返回的数据 //_recFailTime++; //if (_recFailTime > 3) //{ //已经存在3次没有收到数据,或者数据错误,断开连接,重连 await _netSocketTcpClient.CloseConnectAsync(); break; } else { //说明收到返回数据 //_recFailTime = 0; } _logger.LogError($"当前线程: {name} {_tcpOption.Ip},{_tcpOption.Port} 发送数据----- {_sendCount} {abc1} 发送后收到数据:{ DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss-fff")}"); _index += sendCount; } else { //本轮数据已经发送完成 break; } } _logger.LogWarning($"当前线程: {name} ======================{_tcpOption.Ip},{_tcpOption.Port} 发送线程退出 {DateTime.Now.ToString("yyyy - MM - dd HH: mm:ss-fff")}");
项目中存在两个socket客户端分别连接不同的socket服务(6001、6002),socket客户端接收定时事件用于发送消息。
系统运行一段时间后,会发生多个task任务在同一线程里运行的情况。具体日志如下
连接socket 6001的客户端任务和连接socket 6002的客户端的任务使用的相同的线程65。
分类:
C#
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构