• 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

  • 相关阅读:
    [Docker] Windows 宿主环境下,共享或上传文件到容器的方法
    [Docker]
    [Docker]
    [Docker]
    [Windows]
    [Linux] 树莓派 4B 安装 Ubuntu 19.10 (Eoan Ermine) IOT 版
    [Linux]
    [.Net] 什么是线程安全的并发集合
    [IOT]
    c++库大全
  • 原文地址:https://www.cnblogs.com/Duko/p/16042017.html
Copyright © 2020-2023  润新知