запустить процесс в приложениях AspNetCore без тайм-аута - PullRequest
0 голосов
/ 24 мая 2018

Я новичок в AspNet Core.Я хочу запустить какой-нибудь процесс в фоновом режиме без тайм-аута.Некоторые части процесса должны выполняться рекурсивно, а другие - ежедневно (для индексных данных в поисковой системе lucene).

Теперь я использую контроллер действий, который выполняется в начале каждого запроса, но некоторые процессы заканчиваютсяСостояние тайм-аута.

В качестве обходного пути я установил для HttpRequest тайм-аут длительное время, но это не хорошее решение.

1 Ответ

0 голосов
/ 24 мая 2018

вы должны использовать BackGround Process, в котором реализован интерфейс IHostedService.как это:

public abstract class BackgroundService : IHostedService, IDisposable
    {
        private Task _executingTask;
        private readonly CancellationTokenSource _stoppingCts =
                                                       new CancellationTokenSource();

        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();
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...