爲何會寫這個東西呢?本人在寫消息隊列的時候思考過一個問題——好比,每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); }