После документов я реализовал библиотеку, которая позволяет моему веб-интерфейсу создавать и запускать задачи в фоновом режиме.По сути, я создаю QueuedHostedService
(который наследуется от BackgroundService
), который содержит задачу для завершения и добавляет ее в очередь.Затем эту очередь постепенно очищают, выполняя эти задачи одновременно (я полагаю, в разных потоках).Ниже приведен абстрактный класс BackgroundService
public abstract class BackgroundService : IHostedService, IDisposable
{
protected BackgroundService();
public virtual void Dispose();
//
// Summary:
// Triggered when the application host is ready to start the service.
//
// Parameters:
// cancellationToken:
// Indicates that the start process has been aborted.
public virtual Task StartAsync(CancellationToken cancellationToken);
//
// Summary:
// Triggered when the application host is performing a graceful shutdown.
//
// Parameters:
// cancellationToken:
// Indicates that the shutdown process should no longer be graceful.
[AsyncStateMachine(typeof(<StopAsync>d__4))]
public virtual Task StopAsync(CancellationToken cancellationToken);
//
// Summary:
// This method is called when the Microsoft.Extensions.Hosting.IHostedService starts.
// The implementation should return a task that represents the lifetime of the long
// running operation(s) being performed.
//
// Parameters:
// stoppingToken:
// Triggered when Microsoft.Extensions.Hosting.IHostedService.StopAsync(System.Threading.CancellationToken)
// is called.
//
// Returns:
// A System.Threading.Tasks.Task that represents the long running operations.
protected abstract Task ExecuteAsync(CancellationToken stoppingToken);
. Что я не знаю, так это то, что происходит именно после завершения Task
?Нужно ли мне что-то делать (например, использовать метод Dispose) или система заботится об освобождении ресурса, выделенного фоновому потоку?
EDIT Я добавляю реализациюкласс QueuedHostedService
, который реализует ExecuteAsinc()
методы
public class QueuedHostedService : BackgroundService
{
private static ILog logger = LogExtensions.GetClassLogger();
public QueuedHostedService(IBackgroundTaskQueue taskQueue)
{
TaskQueue = taskQueue;
}
public IBackgroundTaskQueue TaskQueue { get; }
protected async override Task ExecuteAsync(CancellationToken cancellationToken)
{
logger.MethodEnter();
while (!cancellationToken.IsCancellationRequested)
{
var workItem = await TaskQueue.DequeueAsync(cancellationToken);
try
{
await workItem(cancellationToken);
}
catch (Exception ex)
{
logger.Error($"Error occurred executing {nameof(workItem)}. with the following exception {ex.Message}");
}
}
logger.MethodLeave();
}
}