首页 > 解决方案 > ManualResetEventSlim 阻塞线程,即浪费它们?

问题描述

我为每个呼叫每 20 毫秒生成一个 RTP 数据包。每个呼叫都是在“等待”我的侦听服务器 UDPClient.ReceiveAsync 时处理的。

我正在使用一个高精度计时器(使用 winmm.dll 中的 TimeSetEvent),它每 20 毫秒触发一次,并“设置”为每个不同的传入 UDP 调用创建的专用 ManualResetEventSlim (MRES) 对象。每次设置 MRES 时,都会释放调用线程并在每次调用时发送单个数据包,依此类推。

我是否在没有发出 MRES 信号的情况下继续阻塞线程在没有 CPU 绑定的操作中浪费线程?是否有这个 MRES 的“异步”版本可以等待。如果是,那会增加我的主 UDPClient.RececiveAsync 循环的节流吗?

应用程序是 Windows WinForms和另一个版本作为Windows Service

标签: c#vb.netasynchronous

解决方案


我是否在没有发出 MRES 信号的情况下继续阻塞线程在没有 CPU 绑定的操作中浪费线程?

从技术上讲,是的。但是,有时,“浪费”线程正是您想要做的。具体来说,当编写具有严格时序要求的桌面控制软件时,阻塞线程往往比异步代码提供更可靠的行为。

是否有这个 MRES 的“异步”版本可以等待。

是的,AsyncManualResetEvent我的AsyncEx 库中有一个。或者您可以构建自己的. Stephen Toub 的 build-your-own 版本性能更高;我的 AsyncEx 版本针对可维护性而非性能进行了优化。

如果是,那会增加我的主 UDPClient.RececiveAsync 循环的节流吗?

不知道。


推荐阅读