c# - ManualResetEventSlim 阻塞线程,即浪费它们?
问题描述
我为每个呼叫每 20 毫秒生成一个 RTP 数据包。每个呼叫都是在“等待”我的侦听服务器 UDPClient.ReceiveAsync 时处理的。
我正在使用一个高精度计时器(使用 winmm.dll 中的 TimeSetEvent),它每 20 毫秒触发一次,并“设置”为每个不同的传入 UDP 调用创建的专用 ManualResetEventSlim (MRES) 对象。每次设置 MRES 时,都会释放调用线程并在每次调用时发送单个数据包,依此类推。
我是否在没有发出 MRES 信号的情况下继续阻塞线程在没有 CPU 绑定的操作中浪费线程?是否有这个 MRES 的“异步”版本可以等待。如果是,那会增加我的主 UDPClient.RececiveAsync 循环的节流吗?
应用程序是 Windows WinForms和另一个版本作为Windows Service。
解决方案
我是否在没有发出 MRES 信号的情况下继续阻塞线程在没有 CPU 绑定的操作中浪费线程?
从技术上讲,是的。但是,有时,“浪费”线程正是您想要做的。具体来说,当编写具有严格时序要求的桌面控制软件时,阻塞线程往往比异步代码提供更可靠的行为。
是否有这个 MRES 的“异步”版本可以等待。
是的,AsyncManualResetEvent
我的AsyncEx 库中有一个。或者您可以构建自己的. Stephen Toub 的 build-your-own 版本性能更高;我的 AsyncEx 版本针对可维护性而非性能进行了优化。
如果是,那会增加我的主 UDPClient.RececiveAsync 循环的节流吗?
不知道。
推荐阅读
- sql - 根据与要加入的值关联的列加入不同的表?
- node.js - 如何在詹金斯中将nodejs服务器作为后台任务运行并在自动构建时重新启动服务器?
- c# - 无法通过 ID 访问元素
- c# - SMTP 服务器需要安全连接
- python - uwsgi-nginx-flask: 无法加载应用程序 0 (mountpoint='') (callable not found or import error)
- opencl - 替代 clGetGLContextInfoKHR?
- javascript - events.js174 // 未处理的“错误”事件(错误:连接 ECONNREFUSED 127.0.0.1:21)连接到 FTP 位置时
- python - 当他们在同一个班级时,如何使用漂亮的汤提取数据(文本)?
- python - 需要帮助在 Windows 10 中为 python 安装 fiona 和 geopandas - 出现无法加载请求的 DLL 错误
- internet-explorer - 不知何故,背景图像路径在某些浏览器上不起作用