c# - 如何为 BackgroundService 的 ExecuteAsync 设置超时?

标签 c# .net-core

我有一个名为 Worker 的 BackgroundService,我重写了 ExecuteAsync 方法以每 10 秒运行一次。有时,我跑的东西会持续很长时间。在这种情况下,我想终止正在运行的程序,然后重新运行它。我怎样才能做到这一点?

我的后台服务如下:

    public class Worker : BackgroundService {
        private readonly ITask task;
        private readonly IHostApplicationLifetime appLifeTime;

        public Worker(ITask task, IHostApplicationLifetime appLifeTime) {
            this.task = task;
            this.appLifeTime = appLifeTime;
        }

        protected override async Task ExecuteAsync(CancellationToken stoppingToken) {
            while (!stoppingToken.IsCancellationRequested)
            {
                try {
                    this.task.Execute(stoppingToken);
                } catch (Exception e) {
                    this.appLifeTime.StopApplication();
                }

                await Task.Delay(10000, stoppingToken);
            }
        }
    }

    public interface ITask {
        void Execute(CancellationToken stoppingToken);
    }

最佳答案

你可以按照这些思路做一些事情:

protected override async Task ExecuteAsync(CancellationToken stoppingToken) {
    var cancellationSource = CancellationTokenSource.CreateLinkedTokenSource(stoppingToken);
    cancellationSource.CancelAfter(10000);
    
    return Task.Run(() => task.Execute(cancellationSource.Token));
}

如果你想处理执行和/或等待任务,那么你可以,但这是一个简单的例子。

关于c# - 如何为 BackgroundService 的 ExecuteAsync 设置超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66455973/

相关文章:

c# - 检查 Console.ReadLine()!=null

c# - DbQuery 中 ObjectQuery.Parameters 的等价物是什么

c# - 无法将 key 文件添加到 X509Certificate2

entity-framework - 使用 dotnet ef 迁移创建数据库时如何设置字符集?

c# - 找不到任何兼容的框架版本。找不到指定的框架 'Microsoft.NETCore.App'和版本 '2.2.0'

.net - 从 .Net Core 应用程序调用 .Net Framework 4(或 Mono)程序集

c# - 工厂车间模拟

c# - "char.IsUpper"(不带括号)是如何工作的?

c# - 在 monomac 项目中查找图像文件的路径

c# - 从格式 dd.MM.yyyy hh :mm:ss 将字符串解析为 .net 核心中的日期时间