ASP.NET中的System.Threading.Timer和Thread.Sleep()之间的区别c#

时间:2012-01-17 12:26:57

标签: c# asp.net multithreading timer sleep

  

可能重复:
  Compare using Thread.Sleep and Timer for delayed execution

我正在考虑是否在我的ASP.NET Web应用程序中使用System.Threading.Timer或Thread.Sleep。我寻找他们的不同之处。期间或睡眠时间为100毫秒。 AFAIK如果我使用Timer它不会阻止正在运行的线程,但Sleep将阻止正在运行的线程。

由于间隔非常小,选择Thread.Sleep(150)会不会更好?

编辑:我倾向于像非线程池线程上的计时器一样使用它。我知道Timers将在线程池上运行,但我不想为这样的操作保留线程池线程

3 个答案:

答案 0 :(得分:5)

我建议阅读:

Comparing the Timer Classes in the .NET Framework Class Library

没有一个计时器会阻止正在运行的线程,但是由于应用程序主线程上的活动而打勾的频率不同,如上文所述。

您使用的确取决于您想要的最终结果!虽然Thread.Sleep被大多数人视为反模式。

答案 1 :(得分:3)

Thread.Sleep()有一些用途,至关重要。这些是很少的,如果你使用任何高于约1的数字作为参数,你几乎肯定没有。

如果甚至可以使用计时器,那么你肯定没有。当备选方案甚至不困难时,不要阻止完美的线程。

请注意在前一个触发器仍在运行时触发定时器的情况。根据操作的性质,您可能需要:

  1. 忽略这一点,如果调用的代码对多个同时调用是安全的,那么这可能没问题。当然,你必须知道它没关系。
  2. 锁定定时器触发的操作。请注意,您最终可能会有许多待处理操作的队列。
  3. 锁定定时器触发的操作,尝试获取超时为零的锁定,如果失败则跳过它 - 从最后一次开始仍有一个线程。
  4. 将计时器作为一次性计时器,在每次通话结束时重新启动。

答案 2 :(得分:2)

请特别注意previous question & answer @EricRosenberger提供的答案,因为我相信它会回答您的问题。

关于你的情况,我相信你问的是this question you previously asked?即:你有一个使用线程的ASP.NET应用程序,并且CPU使用率很高,但是当使用Systen.Threading.Timer时它没有尖峰。对于当前的Q可能是偏离主题但是为了帮助你的整体情况你可能会发现,正如Eric Rosenberger所说,线程的创建和销毁可能是导致CPU峰值的原因而不是线程内运行的代码的实际实现。

致以最诚挚的问候,