簡體   English   中英

Periodic Timer 強制每秒運行一次

[英]Periodic Timer force to run every second

我創建了在后台服務下運行的周期性計時器

public class PeriodicHostedService : BackgroundService
    {
        private readonly TimeSpan period = TimeSpan.FromSeconds(1);
        private readonly ILogger<PeriodicHostedService> logger;
        private readonly IServiceScopeFactory factory;
        private int executionCount = 0;

        public PeriodicHostedService(ILogger<PeriodicHostedService> logger, IServiceScopeFactory factory)
        {
            this.logger=logger;
            this.factory=factory;
        }

        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            using PeriodicTimer timer = new(period);            
            using var scope = factory.CreateScope();
            ITimerJob job = scope.ServiceProvider.GetRequiredService<ITimerJob>();
            while (
                !stoppingToken.IsCancellationRequested &&
                await timer.WaitForNextTickAsync(stoppingToken))
            {
                try
                {
                    await job.ProcessAsync();
                    executionCount++;
                    logger.LogInformation($"Executed PeriodicHostedService - Count: {executionCount}");
                   
                }
                catch (Exception ex)
                {
                    logger.LogInformation($"Failed to execute PeriodicHostedService with exception message {ex.Message}. Good luck next round!");
                }
            }
        }
}

我已經設置了每秒運行一次的計時器,但是我在計時器中的工作需要運行超過 1 秒只是一個例子

internal class TimerJob : ITimerJob
    {
        private int runningID;
               
        public async Task  ProcessAsync()
        {
            runningID++;
            Console.WriteLine($"{DateTime.Now} > Current Running ID : {runningID}");
            await LongTimeJob();
           
        }
        private async Task LongTimeJob ()
        {
            Console.WriteLine($"{DateTime.Now} > Step1 Async Job End ID : {runningID}");
            await Task.Delay(3000).ConfigureAwait(false);
        }
}

我能知道如何編寫每秒強制執行的計時器嗎(並讓長時間的工作繼續工作)謝謝

您可以選擇不等待 job.ProcessAsync() 這將允許您的代碼繼續等待下一個滴答聲。

_ = job.ProcessAsync();

我必須承認,每分鍾運行的作業可能會運行很長時間,最終可能會成為資源消耗者。 您應該檢查您的設計是否有任何不需要的副作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM