繁体   English   中英

在特定时间段内阻塞线程的精确方法是什么?

[英]What is a precise way to block a thread for a specific period of time?

我正在使用的系统需要消耗IEnumerable的工作项,遍历每个工作项,并且在它们之间等待一定的时间。 我想让枚举站点的系统尽可能简单。 也就是说,我想有一个方法可以在foreach块的末尾调用,该方法将在我指定的特定时间段内阻塞-但我不想使用Thread.Sleep,因为无法保证精确。

我需要阻塞的最短时间是100毫秒,但是我不希望它阻塞的时间超过此时间,我已经看到Thread.Sleep有时会这样做(我想是因为上下文花费了很多时间开关等)。

编辑:相关; 对带有超时值的WaitHandle.Wait的调用与Thread.Sleep做相同的事情吗?

给予或接受Thread.Sleep()的精度约为20ms。 如果不使用(不受管理的)多媒体计时器,您将无法获得更好的收益。 而且,由于您只是暂停了一点看似过大的操作。 尝试睡眠(80)。

另外:据我所知,所有超时值都具有与Sleep()相同的分辨率。

为什么您需要在迷人的时候等待呢?

如果IEnumerable集合在您浏览过程中发生更改,您将获得异常,因此,实际上,在您处理线程时,其他线程无法添加或删除任何项目。

鉴于此,为什么人为地延迟? 只需消耗它就可以了,让调度程序在线程之间分配工作。

如果您想要一个非常准确的等待时间,建议您使用Thread.Sleep(time-20 ms),然后忙于等待正确的时间来完成工作。

只有实时操作系统才能为您提供这种精度。 您可以假设Thread.Sleep的精度约为20毫秒,因此从理论上讲,您可以一直睡到所需的时间-实际时间约为20毫秒,然后旋转20毫秒,但您必须浪费那20毫秒。 即使这样也不能保证您将获得实时结果,调度程序可能只是在即将执行RELEVANT部分时(在旋转之后)才将线程取出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM