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。