利用 BackgroundService 固定時間間隔執行某動作


繼承 BackgroundService 類:

  為什么會寫這個東西呢?本人在寫消息隊列的時候思考過一個問題——比如,每5秒從隊列里面取一條消息(一條消息里面又包含了1000條數據),要把這1000條數據處理完所需要的時間遠大於5秒,即執行到中間的時候就會獲取新的一條消息,並執行新的消息里面的數據,我所存在的疑問是,這個時候第一條消息里面的數據會被怎么執行?所以就寫了這樣的代碼進行了測試!測試的結果是:每一次執行都會開啟一條新的線程,而線程內部的數據是互不影響的,每一個線程都會執行到底!

    class TimedBackgroundService : BackgroundService
    {
        private Timer _timer;
        private int i = 0;

        protected override Task ExecuteAsync(CancellationToken stoppingToken)
        {
            _timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5));           //每5秒開啟一個線程
            return Task.CompletedTask;
        }

        private void DoWork(object state)
        {
            i++;
            int name = i;       //i表示這是第幾個線程

            for (int j = 0; j < 100; j++)
            {
                Console.WriteLine($"這里是線程{name}:  正在執行j = {j}");
                Task.Delay(TimeSpan.FromSeconds(1)).Wait();        //等待1秒
            }
        }

        public override Task StartAsync(CancellationToken cancellationToken)
        {
            return ExecuteAsync(cancellationToken);
        }

        public override void Dispose()
        {
            base.Dispose();
            _timer?.Dispose();
        }
    }

調用:

        public static void CheckBackgroundService()
        {
            TimedBackgroundService server = new TimedBackgroundService();
            CancellationToken token = new CancellationToken();
            server.StartAsync(token);
        }

測試結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM