tnblog
首页
视频
资源
登录

.net Thread.Sleep长时间睡眠的问题

8766人阅读 2021/2/2 11:08 总访问:3467223 评论:1 收藏:0 手机
分类: .net后台框架

.netcore

.net Thread.Sleep长时间睡眠的问题

在工作中,不知道大家有没有发现,Thread.Sleep如果设置的时间过长,会导致它就像人睡着了一样到点了都不醒过来。但如果你在它睡眠的时候去按一下回车键多按几下,它就醒了。这就会让我觉得它要长时间睡眠后不能保证我的服务得以正常的运行。网友说:它仅保证将线程至少暂停这么多秒,因为它基于针对不同Windows版本的时间片编号。具体问题可以看看这个:https://blogs.msmvps.com/peterritchie/2007/04/26/thread-sleep-is-a-sign-of-a-poorly-designed-program/

解决问题

那么如何解决呢?我们可以通过调度的方式来解决。在最高级别上,您可以使用Quartz.NET库,但是如果您不需要任何大的逻辑来安排执行时间,那么这会有些负担。
可以使用的一件事是 System.Threading.AutoResetEventSystem.Timers.Timer类结合。以下是在无限循环中使用TimerAutoResetEvent的示例,该循环是错误使用Thread.Sleep的最常见地方。

  1. /// <summary>
  2. /// 我们将它设置10秒调度一次
  3. /// </summary>
  4. static readonly System.Timers.Timer timer = new System.Timers.Timer(TimeSpan.FromSeconds(10).TotalMilliseconds) { AutoReset = true };
  5. /// <summary>
  6. /// 我们将第一次不让它过让它为false
  7. /// </summary>
  8. static readonly AutoResetEvent autoResetEvent = new AutoResetEvent(false);
  9. static void Main(string[] args)
  10. {
  11. timer.Elapsed += Timer_Elapsed;
  12. timer.Start();
  13. ThreadPool.QueueUserWorkItem((state) =>
  14. {
  15. while (true)
  16. {
  17. Console.WriteLine(DateTime.Now);
  18. autoResetEvent.WaitOne();
  19. }
  20. });
  21. Console.ReadLine();
  22. }
  23. /// <summary>
  24. /// 调度的事件
  25. /// </summary>
  26. /// <param name="sender"></param>
  27. /// <param name="e"></param>
  28. private static void Timer_Elapsed(object sender, ElapsedEventArgs e)
  29. {
  30. autoResetEvent.Set();
  31. }

实际上,我们不必依赖Thread.Sleep切片,而是可以使用Timer设置事件并安排Thread执行。由于它是AutoResetEvent而不是ManualResetEvent,因此一旦线程执行,我们将自动重置事件。


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

bk

2021/2/2 18:26:49

[good][good]

net core 使用 EF Code First

下面这些内容很老了看这篇:https://www.tnblog.net/aojiancc2/article/details/5365 项目使用多层,把数据库访问...

cAPS.net 保存base64位格式的图片

publicvoidUpload() { //取出图片对应的base64位字符 stringimgBase=Request[&quot;imgBase&quot;]; //c#里边的base6...

Quartz.net实例动态改变周期调度。misfire、Cron

Quartz:Java编写的开源的任务调度作业框架 类似Timer之类定时执行的功能,但是更强大Quartz.NET:是把Quartz转成C# NuGet...

.net Windows服务发布、安装、卸载、监听脚本。服务调试

一、脚本 为方便不用每次都去写安装卸载的脚本1.安装脚本@echooff @echo开始安装【服务】 %SystemRoot%\Microsoft.NET\Fr...

c、VB.net中全角半角转换方法

///&lt;summary&gt; ///转全角的函数(SBCcase) ///&lt;/summary&gt; ///&lt;paramname=&quot;input&quot;&gt;任意字符串...

.net mvc分部页,.net core分部页

.net分部页的三种方式第一种:@Html.Partial(&quot;_分部页&quot;)第二种:@{ Html.RenderPartial(&quot;分部页&quot;);}...

C.net 配合小程序实现经过第三方服务器中转文件

某些时候,微信小程序前段上传文件的时候需要经过第三方服务器再将文件上传到客户的服务器;操作如下:1:(小程序内向中端服...

.net实现QQ邮箱发送邮件功能

1、微软已经帮我们封装好了发送邮件的类MailMessage,MailMessage类构造一些邮件信息,然后通过SmtpClient进行邮件发送。Mai...

StackExchange.Redis操作redis(net core支持)

官方git开源地址https://github.com/StackExchange/StackExchange.Redis官方文档在docs里边都是官方的文档通过nuget命令下...

windows 自带的netsh进行端口映射

使用netsh 把本地任意ip的25566端口 映射到192.168.81.234的25565端口netshinterfaceportproxyaddv4tov4listenaddress=0.0....

确保.net程序始终以管理员身份运行

usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Threading.Tasks; ...

ASP.net Timer细节处理

Timer的用法:1:本人称之为计时器,是asp.net官方的一种。用法即是计时所用 2:关于计时有很多中方式,本人学识有限,暂...

.net core 使用session

tip:net core 2.2后可以直接启用session了,不用在自己添加一次session依赖,本身就添加了使用nuget添加引用Microsoft.AspN...

通俗易懂,什么是.net?什么是.net Framework?什么是.net core?

朋友圈@蓝羽 看到一篇文章写的太详细太通俗了,搬过来细细看完,保证你对.NET有个新的认识理解原文地址:https://www.cnblo...

asp.net core2.0 依赖注入 AddTransient与AddScoped的区别

asp.net core主要提供了三种依赖注入的方式其中AddTransient与AddSingleton比较好区别AddTransient瞬时模式:每次都获取一...
这一世以无限游戏为使命!
排名
2
文章
634
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术