Я считаю, что это дублирующий вопрос к тому, на что я отвечал раньше.
Где я должен запускать постоянные фоновые задачи в ASP.NET Core?
Ниже приведен ответ, скопируйте + вставьте.
Я полагаю, вы ищете это
https://blogs.msdn.microsoft.com/cesardelatorre/2017/11/18/implementing-background-tasks-in-microservices-with-ihostedservice-and-the-backgroundservice-class-net-core-2-x/
И я провел 2 часа самопровозглашенного хакатона, удостоенного наград, чтобы узнать, как это происходит.
https://github.com/nixxholas/nautilus
Вы можете сослаться на инъекции здесь и реализовать тезисы оттуда тоже.
Многие проекты MVC на самом деле не требуются для выполнения постоянных фоновых задач. Вот почему вы не видите их в новом проекте через шаблон. Лучше предоставить разработчикам интерфейс для подключения и продолжить его.
Кроме того, что касается открытия этого сокетного соединения для таких фоновых задач, мне еще предстоит найти решение для этого. Насколько я знаю / знаю, я мог транслировать полезную нагрузку только тем клиентам, которые подключены к моему собственному сокет-менеджеру, поэтому вам придется искать это в других местах. Я обязательно подам звуковой сигнал, если в IHostedService есть что-то, касающееся веб-сокетов.
Хорошо, в любом случае вот что происходит.
Поместите это куда-нибудь в свой проект, это скорее интерфейс для перегрузки, чтобы вы могли создать свою собственную задачу
/// Copyright(c) .NET Foundation.Licensed under the Apache License, Version 2.0.
/// <summary>
/// Base class for implementing a long running <see cref="IHostedService"/>.
/// </summary>
public abstract class BackgroundService : IHostedService, IDisposable
{
protected readonly IServiceScopeFactory _scopeFactory;
private Task _executingTask;
private readonly CancellationTokenSource _stoppingCts =
new CancellationTokenSource();
public BackgroundService(IServiceScopeFactory scopeFactory) {
_scopeFactory = scopeFactory;
}
protected abstract Task ExecuteAsync(CancellationToken stoppingToken);
public virtual Task StartAsync(CancellationToken cancellationToken)
{
// Store the task we're executing
_executingTask = ExecuteAsync(_stoppingCts.Token);
// If the task is completed then return it,
// this will bubble cancellation and failure to the caller
if (_executingTask.IsCompleted)
{
return _executingTask;
}
// Otherwise it's running
return Task.CompletedTask;
}
public virtual async Task StopAsync(CancellationToken cancellationToken)
{
// Stop called without start
if (_executingTask == null)
{
return;
}
try
{
// Signal cancellation to the executing method
_stoppingCts.Cancel();
}
finally
{
// Wait until the task completes or the stop token triggers
await Task.WhenAny(_executingTask, Task.Delay(Timeout.Infinite,
cancellationToken));
}
}
public virtual void Dispose()
{
_stoppingCts.Cancel();
}
}
Вот как вы можете его использовать
public class IncomingEthTxService : BackgroundService
{
public IncomingEthTxService(IServiceScopeFactory scopeFactory) : base(scopeFactory)
{
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
using (var scope = _scopeFactory.CreateScope())
{
var dbContext = scope.ServiceProvider.GetRequiredService<NautilusDbContext>();
Console.WriteLine("[IncomingEthTxService] Service is Running");
// Run something
await Task.Delay(5, stoppingToken);
}
}
}
}
Если вы заметили, там есть бонус. Вам понадобится сервисная область для доступа к операциям с БД, потому что она одиночная.
Введите ваш сервис в
// Background Service Dependencies
services.AddSingleton<IHostedService, IncomingEthTxService>();