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

繼承 BackgroundService 類:

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

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

測試結果:

相關文章
相關標籤/搜索