Что произойдет после того, как BackgroundService завершит свою задачу? - PullRequest
0 голосов
/ 26 февраля 2019

После документов я реализовал библиотеку, которая позволяет моему веб-интерфейсу создавать и запускать задачи в фоновом режиме.По сути, я создаю 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();
    }
}
...