C#学习教程:将当前线程放入Hibernate在某些情况下,我希望这个线程休眠10秒。Thread.Sleep(10000)是最有效的方法吗?Thread.Sleep(10000)是最有效的方法吗?是的,因为它不忙——等待但放弃CPU。但是浪费了一个线程。您不应该将其扩展到许多休眠线程。没有人提到它......如果你想让另一个线程能够唤醒你的“休眠”线程,你可能想使用Monitor.Wait而不是Thread.Sleep:privatereadonlyobjectsharedMonitor;私人布尔应该停止;publicvoidStop(){lock(sharedMonitor){shouldStop=true;监视器。脉冲(共享监视器);}}publicvoidLoop(){while(true){//做一些工作...lock(sharedMonitor){if(shouldStop){return;}Monitor.Wait(sharedMonitor,10000);如果(应该停止){返回;}}}}请注意,我们只在锁内访问shouldStop,因此不存在任何内存模型问题。您可能想要循环并等到您真正睡了10秒,以防您被虚假唤醒——这取决于您不再做10秒工作的重要性。(我从未听说过故意虚假唤醒,但我相信它们是可能的。)养成使用Thread.CurrentThread.Join(timeout)而不是Thread.Sleep的习惯。不同之处在于Join仍然执行一些消息传递(如GUI和COM)。大多数时候这无关紧要,但如果您需要在应用程序中使用某些COM或GUI对象,这会让生活变得更轻松。从资源效率的角度来看,是的。对于设计,这取决于悬架情况。您希望您的工作是自主的,因此如果线程因为知道要等待而必须暂停,则使用静态Thread.Sleep方法将暂停放在线程代码中。如果暂停是由于某些其他外部事件而不是您需要控制线程处理而发生的,则让线程所有者保留对该线程的引用并调用childThread.Sleep。是的。没有其他有效或安全的方法来休眠线程。但是,如果您在循环中执行某些工作,您可能希望使用Sleepinloop以便在您想取消工作时更轻松地中止线程。这是一个例子:boolexit=false;...voidMyThread(){while(!exit){//在这里做你的事情...东西...//休眠10秒intsc=0;while(sc这将在不使用线程的情况下每x秒处理一次事件不确定如何与不使用自己的线程每两秒创建一次的运行任务进行比较全部内容,如果对您有用并且您需要了解更多有关C#的学习教程,希望大家多多关注---publicvoidLogProcessor(){if(_isRunning){WriteNewLogsToDisk();//2秒后回来vart=Task.Run(asyncdelegate{awaitTask.Delay(2000);LogProcessor();});}}本文采集自网络,不代表立场,如涉及侵权,请点击维权联系管理员删除,转载请注明出处:
