当前位置: 首页 > article >正文

多线程环境中,如果多个线程同时尝试向同一个TCP客户端发送数据,添加同步机制

  1. 原代码
public async Task SendToClientAsync(TcpClient targetClient, byte[] data, int offset, int length)
{try{// 1. 检查客户端是否有效if (targetClient == null || !targetClient.Connected){Console.WriteLine("Cannot send: client is not connected");return;}// 2. 使用参数中的客户端对象NetworkStream stream = targetClient.GetStream();// 3. 异步写入数据await stream.WriteAsync(data, offset, length);Console.WriteLine("Data sent to client.");}catch (Exception ex){Console.WriteLine($"Error sending data to client: {ex.Message}");// 可添加更多错误处理逻辑,如重试或清理连接}
}

2.
在这里插入图片描述
解决方案:添加同步机制
方案1:客户端级别的锁(推荐)

private readonly ConcurrentDictionary<TcpClient, SemaphoreSlim> clientLocks = new();public async Task SendToClientAsync(TcpClient targetClient, byte[] data, int offset, int length)
{// 获取或创建客户端专属锁var clientLock = clientLocks.GetOrAdd(targetClient, _ => new SemaphoreSlim(1, 1));await clientLock.WaitAsync();try{if (targetClient.Connected){NetworkStream stream = targetClient.GetStream();await stream.WriteAsync(data, offset, length);}}finally{clientLock.Release();}
}

方案2:全局锁(简单但性能低)

private readonly object sendLock = new object();public async Task SendToClientAsync(TcpClient targetClient, byte[] data, int offset, int length)
{lock (sendLock) // 全局同步锁{if (targetClient.Connected){NetworkStream stream = targetClient.GetStream();stream.Write(data, offset, length); // 注意:同步写入}}
}

在这里插入图片描述

http://www.lryc.cn/news/2401212.html

相关文章:

  • 【含文档+PPT+源码】基于微信小程序的旅游论坛系统的设计与实现
  • 贝叶斯优化+LSTM+时序预测=Nature子刊!
  • NodeJS全栈WEB3面试题——P3Web3.js / Ethers.js 使用
  • Quick UI 组件加载到 Axure
  • Vue3(ref与reactive)
  • Starrocks中RoaringBitmap杂谈
  • 通过ca证书的方式设置允许远程访问Docker服务
  • 涂胶协作机器人解决方案 | Kinova Link 6 Cobot在涂胶工业的方案应用与价值
  • 理解继承与组合的本质:Qt 项目中的设计选择指南
  • 新手小白使用VMware创建虚拟机安装Linux
  • 使用 PHP 和 Guzzle 对接印度股票数据源API
  • EscapeX:去中心化游戏,开启极限娱乐新体验
  • 使用PyQt5的图形用户界面(GUI)开发教程
  • STM32实战:智能环境监测站设计方案
  • 猎板硬金镀层厚度:新能源汽车高压系统的可靠性基石
  • KEYSIGHT是德科技 E5063A 18G ENA系列网络分析仪
  • VR 虚拟仿真工器具:开启医学新视界的智慧钥匙​
  • webshell管理工具、C2远控服务器流量分析
  • JavaWeb:前端工程化-TS(TypeScript)
  • unity+ spine切换武器不换皮肤解决方案
  • [java八股文][MySQL面试篇]SQL基础
  • Ubuntu中SSH服务器安装使用
  • 【AI论文】SWE-rebench:一个用于软件工程代理的任务收集和净化评估的自动化管道
  • Flask文件处理全攻略:安全上传下载与异常处理实战
  • 【算法深练】分组循环:“分”出条理,化繁为简
  • 焊缝缺陷焊接缺陷识别分割数据集labelme格式5543张4类别
  • 关于scrapy在pycharm中run可以运行,但是debug不行的问题
  • Java高级 | 【实验四】Springboot 获取前端数据与返回Json数据
  • 云数据库选型指南:关系型 vs NoSQL vs NewSQL的企业决策
  • Prj08--8088单板机C语言8255读取按键码