c#服务的方法中线程Sleep失效问题
需求:控制服务中方法的执行时间,在5-10分钟内随机选择一个时间执行一次打印操作。
刚开始我尝试用Sleep,结果失败了,打印操作还是会3s执行一次,代码如下:
namespace ZgWeb.Service
{
public class TestDataService : IHostedService
{
private Timer _timer1;
Random _rd = new Random();
private int _sleepTime; //分钟
private void WriteDemo(object state)
{
try
{
_sleepTime = _rd.Next(5,10);
Thread.Sleep(_sleepTime*60*1000); // 此处的Sleep无效,以下语句还是会三秒打印一次
Console.WriteLine("我的内心是拒绝三秒执行一次的");
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
public Task StartAsync(CancellationToken cancellationToken)
{
_timer1 = new Timer(WriteDemo, null, TimeSpan.Zero, TimeSpan.FromSeconds(3));
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
_timer1?.Dispose();
return Task.CompletedTask;
}
}
}
然后换了一种方式:
- 在_timer1执行之前生成一个系统时间_dateTimeSys
- 给_sleepTime设置一个初始值为五分钟
- 当前时间[DateTime.Now] 超过系统时间加上等待时间[_dateTimeSys.AddMinutes(_sleepTime)] 时重新为_sleepTime和_dateTimeSys赋值并执行打印操作
namespace ZgWeb.Service
{
public class TestDataService : IHostedService
{
private Timer _timer1;
Random _rd = new Random();
private int _sleepTime = 5; //分钟
private DateTime _dateTimeSys; //系统时间
private void WriteDemo(object state)
{
try
{
if (_dateTimeSys.AddMinutes(_sleepTime) <= DateTime.Now)
{
_sleepTime = _rd.Next(5, 10);
_dateTimeSys = DateTime.Now;
Console.WriteLine("我的内心是拒绝三秒执行一次的");
}
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
public Task StartAsync(CancellationToken cancellationToken)
{
_dateTimeSys = DateTime.Now;
_timer1 = new Timer(WriteDemo, null, TimeSpan.Zero, TimeSpan.FromSeconds(3));
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
_timer1?.Dispose();
return Task.CompletedTask;
}
}
}
这样就可以成功控制打印操作的执行时间啦!假如各位有更好的方式,麻烦帮帮贫困山区对知识充满渴望的我,谢谢。