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")}");
Task.Run执行体

项目中存在两个socket客户端分别连接不同的socket服务(6001、6002),socket客户端接收定时事件用于发送消息。

系统运行一段时间后,会发生多个task任务在同一线程里运行的情况。具体日志如下

 

 连接socket 6001的客户端任务和连接socket 6002的客户端的任务使用的相同的线程65

 

posted @ 2022-03-22 23:00  都市之夜  阅读(220)  评论(0编辑  收藏  举报