C# ASP.NET c中System.Threading.Timer和Thread.Sleep()之间的差异#

C# ASP.NET c中System.Threading.Timer和Thread.Sleep()之间的差异#,c#,asp.net,multithreading,timer,sleep,C#,Asp.net,Multithreading,Timer,Sleep,可能重复: 我正在考虑在ASP.NET Web应用程序中使用System.Threading.Timer还是Thread.Sleep。我寻找他们的不同之处。周期或睡眠时间为100ms。 如果我使用计时器,它不会阻止正在运行的线程,但睡眠会阻止正在运行的线程 由于间隔很小,选择Thread.Sleep(150)是否更好 Edit:我倾向于像在非线程池线程上使用计时器一样使用它。我知道计时器将在线程池上运行,但我不想为此类操作保留线程池线程我建议阅读: 没有一个计时器会阻止正在运行的线程,但是它

可能重复:

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

由于间隔很小,选择Thread.Sleep(150)是否更好


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

我建议阅读:

没有一个计时器会阻止正在运行的线程,但是它们作为应用程序主线程上活动的结果而勾选的频率不同,如上文所述

你使用哪一种取决于你想要的最终结果!尽管大多数人认为
Thread.Sleep
是一种反模式。

请具体看看@Eric Rosenberger提供的答案,因为我相信它回答了您的问题

关于你的情况,我相信你是在问关于?Ie:您有一个ASP.NET应用程序,它使用线程,CPU使用率正在上升,但在使用Systen.Threading.Timer时不会上升。对于当前的Q来说,这可能是个离题的话题,但为了帮助您的整体情况,您可能会发现,正如Eric Rosenberger所说,线程的创建和破坏可能是导致CPU峰值的原因,而不是线程内运行的代码的实际实现

向您致意,

Thread.Sleep()
有一些非常重要的用途。这些参数非常少,如果您使用任何高于about
1
的数值作为参数,您几乎肯定没有参数

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

当前一个触发器仍在运行时触发计时器时,请务必小心。根据操作的性质,您需要:

  • 忽略这一点,如果调用的代码对于多个同时调用来说是安全的,那么这就可以了。当然,你必须知道这很好
  • 锁定定时器触发的操作。请注意,最终可能会出现一个包含大量挂起操作的队列
  • 锁定计时器触发的操作,尝试在超时为零的情况下获得锁定,如果失败,则跳过它-上次还有一个线程
  • 将计时器作为一次性计时器,在每次通话结束时重新启动

  • 这要视情况而定!这取决于你想要实现什么。如果需要运行的线程等待准备就绪,请使用Sleep。如果要计划以指定的时间间隔运行方法,请使用计时器。如果有其他选项,为什么要使正在运行的线程休眠?Hello Mehmet。请参阅前面的问题和答案,特别是@EricRosenberger提供的答案,因为我相信它回答了您的问题。我希望我的方法永远(无限)运行。它必须经常检查某些情况(100毫秒间隔)。我正在考虑如何利用CPU的使用率。也许创建自己的线程比使用线程池线程并在该线程上睡眠更好?+1表示线程。睡眠为反模式。我倾向于在测试中使用它来模拟“长等待”。我可能理解为什么Thread.Sleep是一种反模式,但如果我倾向于将其作为非线程池线程上的计时器来使用,会怎么样?我知道计时器将在线程池上运行,但我不想让线程池线程用于这种情况operation@Mehmet比如说你的线程。睡眠暂停150毫秒,但代码的执行需要1毫秒到100毫秒之间的可变时间,那么你的计时器间隔在151-251毫秒之间变化,也就是说,它不准确。无论计时器执行方法需要多长时间,您都需要接收尽可能接近150毫秒的事件。@Dr.AndrewBurnett-Thompson-并非总是需要或需要准确的间隔。规范可能会说,‘为了减少服务器上的负载,您必须在收到服务器回复后至少等待2秒钟,然后再轮询服务器’。此外,当代码嵌套在多个级别时,使用计时器回调可能会很尴尬。坚持使用计时器可以将一个简单的sleep()变成一个复杂的状态引擎,它必须将自己作为状态对象提交给计时器,然后再处理超时。不恰当地使用计时器和滥用睡眠一样是一种反模式的行为()。@MartinJames当然是这项工作的正确工具。不清楚提问者真正需要什么,但如果你阅读了他之前的问题,我指的是他似乎需要每隔100毫秒在聊天应用程序中轮询传入的消息,并且CPU峰值有问题(可能来自线程创建),所以这不仅仅是一次性的等待。当你只能通过研究同一个用户的其他问题来给一个问题一个好的答案时,这有点烦人@科林很抱歉意识到交叉pollenate线程是一个混乱的过程,但我之前已经回答了Mehmet的另一个问题,因此对此很熟悉。并不是说我有那么多的空闲时间去寻找谢谢,我已经读过那篇文章了,但它没有回答我的具体问题。我在回调函数的开头使用了Monitor.TryEnter(LockerObject)。我希望它能处理您的第三种情况(尝试在超时为零的情况下获得锁…)。但我没有应用第四种情况,在每次调用结束时重新启动计时器是否如此重要?Thread.Sleep()有一些非常有用的用途。这些在某些类别的应用程序中更为常见,例如通信和过程控制。如果使用小于2的任何数字作为参数,则很可能将sleep()循环误用为int