1

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

我需要阻塞的最短时间是 100 毫秒,但我不希望它阻塞比这更长的时间,我见过 Thread.Sleep 有时会这样做(我假设是因为上下文中花费的时间开关等)。

编辑:相关;使用超时值调用 WaitHandle.Wait 是否与 Thread.Sleep 执行相同的操作?

4

2 回答 2

3

Thread.Sleep() 的准确度约为 20 毫秒,不管是取舍还是取舍。如果不使用(非托管)多媒体计时器,您将不会得到更好的结果。而且因为你只是暂停一个看起来有点矫枉过正的小动作。尝试睡眠(80)。

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

于 2009-08-24T14:00:17.923 回答
2

为什么在枚举时需要等待?

如果 IEnumerable 集合在您浏览它时发生更改,您将得到一个异常,因此事实上,当您的线程正在处理它时,其他线程不能添加或删除任何项目。

鉴于此,为什么要人为延迟?只需在它出现时使用它,让调度程序在您的线程之间分配工作。

如果你想要一个非常精确的等待时间,我建议你使用 Thread.Sleep(time - 20 ms) 然后忙等待合适的时间做你的工作。

只有实时操作系统才能给你这样的精度。您可以假设 Thread.Sleep 的精度约为 20 毫秒,因此理论上您可以休眠到所需的时间 - 实际时间约为 20 毫秒,然后旋转 20 毫秒,但您将不得不浪费这 20 毫秒。即使这样也不能保证你会得到实时结果,调度程序可能只是在它即将执行相关部分时(就在旋转之后)取出你的线程

于 2009-08-24T14:05:36.827 回答