繼承 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); }
測試結果: