1、有这么一个需求,我需要每隔10秒钟处理一件事情,比较耗时,可能会处理两三秒。
最开始,我是使用的定时器,定时10秒处理一次。
这就出现了一个问题,定时一次运行,运行两三秒之后结束,然后只过了六七秒,又再次启动了(定时器固定间隔10秒)
这还算简单的,还有一种可能,定时处理的代码,处理不止两三秒,甚至10秒都处理不完,定时器会再次启动,这时候运行了两个一样的逻辑,这个还不能用加锁处理,不然上一次代码运行完,锁一解开马上运行下一次,太坑后来我换了个想法,用异步:async void Loop()
{
while(true)
{
执行逻辑();
Task.Delay(10*1000);
}
}搞了个死循环。
这个倒是可以了,执行一次不管用了十秒还是二十秒,下次启动都是在休息10秒后运行
但是,我想知道,这个思路有没有问题延迟10秒的时候,会不会消耗什么资源,会不会比定时器效率低很多。。
最开始,我是使用的定时器,定时10秒处理一次。
这就出现了一个问题,定时一次运行,运行两三秒之后结束,然后只过了六七秒,又再次启动了(定时器固定间隔10秒)
这还算简单的,还有一种可能,定时处理的代码,处理不止两三秒,甚至10秒都处理不完,定时器会再次启动,这时候运行了两个一样的逻辑,这个还不能用加锁处理,不然上一次代码运行完,锁一解开马上运行下一次,太坑后来我换了个想法,用异步:async void Loop()
{
while(true)
{
执行逻辑();
Task.Delay(10*1000);
}
}搞了个死循环。
这个倒是可以了,执行一次不管用了十秒还是二十秒,下次启动都是在休息10秒后运行
但是,我想知道,这个思路有没有问题延迟10秒的时候,会不会消耗什么资源,会不会比定时器效率低很多。。
while(条件)
{
method();
//......................
}async void method()
{
await Task.Run(处理逻辑);}
不要使用Task.Delay(10*1000);这些,浪费资源
{
while(条件)
{
await Task.Run(处理逻辑);
}
}
目前根据你说的,
我感觉你适合使用单线程
System.Windows.Forms.Timer具体你看一下https://blog.csdn.net/hanjun0612/article/details/81357492
-》定时器事件中处理异步也是一个道理,为什么要使用死循环while,不推荐。
这样timer就不吃时间了,当然有几纳秒差别
retrun也好,continue也罢 //都是出去
有问题么,正常操作了。行了,别扯啥线程,BackgroundWorker,timer,ThreadPool.QueueUserWorkItem 了,一个正常无比的操作,却不知道跑哪里去了
这个不需要一直运行,我只要求间隔10秒,或者30秒处理一次,所以才做了间隔。
你这个while,应该是会一直循环下去吧,处理完一次又会继续下一次。想知道有没有间隔运行的办法。
我原本是使用定时器,后来就改成了Task.Delay(10*1000),又不知道这么写行不行,最近软件卡的厉害,我又找不到原因,才有点纠结。
private void LoopRefreshList()
{
//不想用定时器
while (this.btnSwitch.Text == "结束")
{
_serverInfoRepository.InitData();
ServerInfoSerivce.RunAllScriptAssist();
ServerInfoSerivce.RunAllTouchSprite();
for (int i = 0; i <= 10; i++)
{
this.SetlbDateTime(new TimeSpan(0,0, 10 - i)); //这个是在UI上输出倒计时,下一次刷新处理列表的时间
Task.Delay(1000).Wait();
if (i == 10) { break; }
}
}
}
为啥不能加锁,当然可以加锁,你只需要让上一次的结尾“冲水10秒”就行实现的办法我知道有几种只是不知道哪种比较合适,如果用Task.Delay(1000).Wait();来做延时10秒继续运行,这个本身没问题的话,我就放心了。
主要是这个项目最近很卡。
而整套逻辑中,只有这个循环里面占用的CPU较大,我就在纠结问题出在哪里。
同意,过早的考虑性能是不实在的, 比如你的东西多少人用,在同一时间段内多少人用个,在同一时间内多少人用同一个功能。 就5个人,逻辑没错,优化毫无意义。但还有一种可能,就是你就是想精进代码,想学习,想换一个思路。想探讨问题。
我主要纠结的是定时器和Task.Delay(1000).Wait();这两种延时的机制,有没有差别。想询问哪种比较合适
其他的异步回调之类的操作,需要延时应该也是需要用Task.Delay(1000)的,感觉应该没差别