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

多线程环境中,如果多个线程同时尝试向同一个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.xdnf.cn/news/10840.html

相关文章:

  • 新版 Xcode 中 CoreData 模型编辑器显示拓扑图功能取消的替代方案
  • IBM DB2分布式数据库架构
  • 决策树指南:如何为您的数据选择合适的特征工程策略
  • 【卡点变速】节拍同步 讨论
  • Array.prototype.find()
  • 前端​​HTML contenteditable 属性使用指南
  • EagleTrader采访|在市场中修行的交易之道与实战反思
  • 【计算机系统结构】知识点总结
  • 产品更新丨谷云科技ETLCloud 3.9.3 版本发布
  • 【AI News | 20250603】每日AI进展
  • ElasticStack对接kafka集群
  • 【相等性比较的通解——理解 JavaScript 中的 Object.is()】
  • 高考数学易错考点02 | 临阵磨枪
  • 深入解析Playwright for Python:浏览器功能与代码实例详解
  • 【Visual Studio 2022】卸载安装,ASP.NET
  • Go Gin框架深度解析:高性能Web开发实践
  • LabVIEW磁悬浮轴承传感器故障识别
  • Windows版PostgreSQL 安装 vector 扩展
  • 服务器被攻击了怎么办
  • pikachu靶场通关笔记11 XSS关卡07-XSS之关键字过滤绕过(三种方法渗透)
  • 华为盘古 Ultra MoE 模型:国产 AI 的技术突破与行业影响
  • 每日算法刷题Day21 6.3:leetcode二分答案2道题,用时1h20min(有点慢)
  • metersphere不同域名的参数在链路测试中如何传递?
  • 【MATLAB代码】制导——三点法,二维平面下的例程|运动目标制导,附完整源代码
  • 采摘机器人项目
  • dvwa5——File Upload
  • 1.6万字测评:deepseek-r1-0528横向对比 gemini-2.5-pro-0506和claude4
  • Cursor + Claude 4:海外工具网站开发变现实战案例
  • 基于PyQt5的相机手动标定工具:原理、实现与应用
  • 【Qt】构建目录设置