RegisterWaitForSingleObject vs System.Timers



我需要在等待特定时间后执行代码。这应该是异步的,而不会阻塞我的线程。我在网上搜索了一下,找到了很多方法。两个选项是使用System.Timers或使用RegisterWaitForSingleObject和ManualResetEvent。

我真的不知道有什么区别,也不知道什么时候该选择其中一个。你能简要地告诉我为什么以及何时将Timers或RegisterWaitForSingleObject与ManualResetEvent一起使用吗?

旁注:我喜欢TAP和TPL,通常更喜欢它们而不是其他模式(但这是不使用System.Timer的唯一原因吗?(

计时器

如果希望同一代码多次运行,并且其间有特定的时间,则可以使用计时器。

RegisterWaitForSingleObject

文件说它最好:

注册正在等待WaitHandle的委托。

当您想要时,会使用WaitHandle

等待对共享资源的独占访问。

如果您没有等待共享资源,那么它不适合您的用例。

手动重置事件

文件显示

表示线程同步事件,当发出信号时,必须手动重置。

"发信号"one_answers"重置"是代码需要做的事情。当一个线程需要向另一个线程发信号表示它可以继续时,就会使用它。

您的用例

你说:

我需要在等待特定时间后执行我的代码。

如果您不需要一遍又一遍地重复代码,并且您没有等待共享资源,也没有等待另一个线程,那么以上方法都不合适。

如果你真的只需要等待一段特定的时间就可以继续,那么,如前所述,使用Task.Delay:

await Task.Delay(5000); //wait 5 seconds

您使用WaitForSingleObject来等待,直到THE OBJECT被指示处于特定状态。或发生超时。所以这不是你想要做的。你希望你的代码被"暂停"一段特定的时间。所以这里的"时间"是主要结果。

我会尝试使用wait Task.Delay(ms(。这看起来是目前最方便的方法。

最新更新