Asp. Net - Запланированная задача с использованием IHostedService - PullRequest
0 голосов
/ 19 февраля 2020

Я работаю над веб-приложением ASP. NET, написанным на C# и размещенным на виртуальной машине Azure, использующей IIS 10 в качестве веб-сервера. Я должен запланировать выполнение фоновой задачи один раз в день. Чтобы добиться этого, я создал следующий класс DailyTask:

public class DailyTask : IHostedService {

    public Task StartAsync(CancellationToken cancellationToken) {
        Debug.WriteLine("start");
        Task.Run(TaskRoutine, cancellationToken);
        return Task.CompletedTask;
    }

    public Task StopAsync(CancellationToken cancellationToken) {
        Debug.WriteLine("stop");
        return null;
    }

    public Task TaskRoutine() {
        while (true) {
            try {
                /* ... */

                DateTime nextStop = DateTime.Now.AddDays(1);
                var timeToWait = nextStop - DateTime.Now;
                var millisToWait = timeToWait.TotalMilliseconds;
                Thread.Sleep((int)millisToWait);
            }

            catch (Exception e) {
                Debug.WriteLine(e);
            }
        }
    }
}

Чтобы запустить эту задачу, я добавил следующий оператор в свой класс Startup:

public class Startup {
    public void ConfigureServices(IServiceCollection services) {
        /* ... */
        services.AddSingleton<Microsoft.Extensions.Hosting.IHostedService, HiddenUserCleaner>();
        /* ... */
    }
}

После развертывания в На моем тестовом сервере я заметил, что это решение работает нормально. Но надежно ли это? Могут ли быть проблемы при использовании в производстве?

1 Ответ

1 голос
/ 19 февраля 2020

Это не безопасно. Посмотрите руководство здесь: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-3.1&tabs=visual-studio

Если приложение неожиданно завершает работу (например, происходит сбой процесса приложения), StopAsyn c может не вызываться , Поэтому любые вызванные методы или операции, выполняемые в StopAsyn c, могут не выполняться.

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

В целом, это не гарантирует, что он будет работать ежедневно. Если приложение по каким-либо причинам часто перезапускается, возможно, оно никогда не запускается.

То же самое верно и для библиотек, таких как hangfire.

Другими решениями могут быть веб-задания, или вы можете проверить, выполнено ли оно сегодня, с помощью некоторого вида постоянства, такого как база данных, в которой хранится время последнего выполнения, а IHostingService будет проверять каждый раз и при запуске должен ли он выполнять фоновое задание и действовать соответствующим образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...