Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何为BackgroundService的ExecuteAsync设置超时?_C#_.net Core - Fatal编程技术网

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

C# 如何为BackgroundService的ExecuteAsync设置超时?,c#,.net-core,C#,.net Core,我有一个名为Worker的后台服务,我覆盖了ExecuteAsync方法,每10秒运行一次。有时候,我跑步的时间很长。在这个场景中,我想杀死我正在运行的东西,然后重新运行它。我怎样才能做到这一点 我的背景服务如下: public class Worker : BackgroundService { private readonly ITask task; private readonly IHostApplicationLifetime appLifeTi

我有一个名为Worker的后台服务,我覆盖了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));
}

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

传递一个CancellationToken,该Token将在X时间后取消。将其与主机的停止令牌相结合。检查已取消的令牌,然后停止应用程序或重试。显然,只有当您的任务真正尊重令牌时,才能工作…CancellationTokenSource具有CancelAfter()方法。Execute确实需要返回一个您可以等待的任务,而不是使IMO无效。事情变得更容易了,但这不会停止主任务。它仍将继续处理,因为它没有被告知取消。对不起,我过于简单化了。我还编辑了答案,我认为如果
ITask.Execute
方法返回了
Task
Oops错过了方法签名中的空白会更好。。。但是现在,如果主机stopsOne可以使用
CancellationTokenSource.CreateLinkedTokenSource
链接取消令牌(如果需要),那么这两个任务都不会停止。我不想在这里给出太多细节,因为这实际上取决于用户的情况。