使用iHostedService运行多个后端服务

时间:2018-10-03 12:43:06

标签: asp.net-core asp.net-core-2.0 asp.net-core-webapi

当前,我的Web API能够按计划运行并触发另一个端点以同步数据。需要调用的服务存储在yml文件中。我设法使它可以为一项服务运行时间表。我想要的是能够使用自己的日程表保存多个端点,并在正确的时间安排和执行它们。

这是我现在拥有的代码

我已经使用iHostedService接口完成了此操作。

这是实现iHostedService的HostService类

public abstract class HostedService : IHostedService
{
    private Task _executingTask;
    private CancellationTokenSource _cts;

    public Task StartAsync(CancellationToken cancellationToken)
    {
        _cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);

        _executingTask = ExecuteAsync(_cts.Token);

        // If the task is completed then return it, otherwise it's running
        return _executingTask.IsCompleted ? _executingTask : Task.CompletedTask;
    }

    public async Task StopAsync(CancellationToken cancellationToken)
    {
        // Stop called without start
        if (_executingTask == null)
        {
            return;
        }

        // Signal cancel
        _cts.Cancel();

        // Wait until the task completes or the stop token triggers
        await Task.WhenAny(_executingTask, Task.Delay(-1, cancellationToken));

        cancellationToken.ThrowIfCancellationRequested();
    }

    // cancel
    protected abstract Task ExecuteAsync(CancellationToken cancellationToken);
}

然后,我将扩展此类并按照以下说明在ExecuteAsync中实现需要执行的操作

public class DataRefreshService : HostedService
{
    private readonly DataFetchService _dataFetchService;

    public DataRefreshService(DataFetchService randomStringProvider)
    {
        _dataFetchService = randomStringProvider;
    }

    protected override async Task ExecuteAsync(CancellationToken cancellationToken)
    {
        try
        {
            while (!cancellationToken.IsCancellationRequested)
            {
                await _dataFetchService.UpdateData(cancellationToken);

                TimeSpan span = _dataFetchService.GetNextTrigger();

                await Task.Delay(span, cancellationToken);
            }
        } catch (Exception)
        {
            await StopAsync(cancellationToken);
            throw new Exception("Error trigger Sync service");
        }
    }
}

这就是我添加到Startup.cs文件中的内容

services.AddSingleton<DataFetchService>();
services.AddSingleton<IHostedService, DataRefreshService>();

1 个答案:

答案 0 :(得分:0)

您可以尝试

Microsoft.Extensions.Hosting.BackgroundService

您还可以尝试使DataRefreshService继承自

{{1}}

您可以了解有关here

的更多信息