c#服务中线程Sleep失效问题

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;
        }

    }
}

然后换了一种方式:

  1. 在_timer1执行之前生成一个系统时间_dateTimeSys
  2. 给_sleepTime设置一个初始值为五分钟
  3. 当前时间[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;
        }

    }
}

这样就可以成功控制打印操作的执行时间啦!假如各位有更好的方式,麻烦帮帮贫困山区对知识充满渴望的我,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值