当前位置: 首页 > 编程语言 > C#

在线程中休眠的替代方案分享

时间:2023-04-10 21:31:24 C#

在线程中休眠的替代方案各种答案表明在线程中休眠是一个坏主意,例如:避免休眠。为什么?经常给出的一个原因是,如果线程处于休眠状态,则很难优雅地退出线程(通过发出终止信号)。假设我想定期检查网络文件夹中的新文件,也许每10秒一次。这似乎非常适合优先级设置为低(或最低)的线程,因为我不希望潜在的耗时文件I/O影响我的主线程。有哪些选择?代码在Delphi中给出,但同样适用于任何多线程应用程序:procedureTNetFilesThrd.Execute();begintrywhile(notTerminated)dobegin//检查新文件//...//在再次旋转之前休息一下if(notTerminated)thenSleep(TenSeconds);结尾;finally//终止(或异常)所以释放所有资源...结束;结尾;一个小的修改可以是://在再次旋转之前休息一下nSleepCounter:=0;while(notTerminated)and(nSleepCounter<500)dobeginSleep(TwentyMilliseconds);公司(nSleepCounter);结尾;但这仍然涉及休眠……标准的做法是等待取消事件。在伪代码中,是这样的:虽然没有终止,但开始//检查新文件//...//在再次旋转之前稍作休息FTerminationEvent.WaitFor(TenSeconds);结尾;要终止,您将覆盖TerminatedSet:procedureTMyThread.TerminatedSet;开始继承;FTerminationEvent.SetEvent;//放弃线程方法中的等待end;事件的等待时间超时,或者事件收到终止信号。这允许您的线程暂停一段时间而不会对CPU造成负担,同时仍然响应终止请求。如果这是我的工作,我想我会用一个带有TTimer的包装类来解决它,它每10秒生成一个新线程。产生一个新线程有点昂贵,但如果你每10秒都这样做,那么主线程的性能可以忽略不计,我想。步骤:创建一个包装类TMyFileSearcher。让它包含一个TTimer。每次计时器命中时,都会产生一个新线程并搜索文件。将OnTerminate处理程序添加到TMyFileSearcher以处理返回的文件。还有其他一些注意事项,例如跟踪是否已生成线程,以便在旧线程运行时不会创建新线程。但是,除此之外,我认为实施起来应该非常简单。以上就是C#学习教程:跟帖里分享的所有内容不睡了,如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: