当前,我的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>();
答案 0 :(得分:0)
您可以尝试
Microsoft.Extensions.Hosting.BackgroundService
您还可以尝试使DataRefreshService继承自
{{1}}
您可以了解有关here
的更多信息