Asp.net Как запустить процесс на фоне?

Под процессом я понимаю что угодно(приложение, процесс виндовс) что может работать на фоне, у меня есть другая c# библиотека, и один из её методов выполняется 2 минуты, я понимаю что такие задачи явно не для asp.net но что поделать .. мне не нужно что бы прям каждый пользователь мог сделать запрос что бы вызвать этот метод, я типо хочу поставить запрет если метод вызван и он не закончился то его повторно вызывать нельзя.
  • Вопрос задан
  • 151 просмотр
Пригласить эксперта
Ответы на вопрос 3
vabka
@vabka Куратор тега C#
Токсичный шарпист
Ну есть два варианта:
Запускать эту работу в HostedService, и класть в concurrent dictionary (или в БД) информацию, что пользователь уже вызвал эту штуку.

Запускать в отдельном процессе, а информацию о запуске хранить в БД.
А коммуницировать через очередь.
Ответ написан
Комментировать
@mletov
Ну вообще из asp.net можно вызывать, к примеру, консольные приложения.

https://stackoverflow.com/questions/20212709/calli...

Записать в базу время запуска, время окончания выполнения и проверять.

Может быть стоит посмотреть в сторону шедулеров, а не действия по кнопке, в Asp.net MVC есть Quartz.
https://metanit.com/sharp/mvc5/24.1.php

В .NET (Core) есть

https://codeburst.io/schedule-cron-jobs-using-host...

https://stackoverflow.com/questions/63795334/in-as...
Ответ написан
Комментировать
AlexanderYudakov
@AlexanderYudakov
C#, 1С, Android, TypeScript
static bool IsLongTaskRunning = false;
static object Sync = new object();

static void StartLongTask() {
    lock(Sync) {
        if (IsLongTaskRunning) // Предыдущий вызов еще не завершился
            return;
        IsLongTaskRunning = true;
    }
    Task.Run(async () => {
        Debug.WriteLine("Long task started...");
        try
        {
            await Task.Delay(TimeSpan.FromMinutes(2)); // "Длинный метод" из моей "другой библиотеки"
            Debug.WriteLine("Long task done.");
        } catch(Exception ex) {
            Debug.WriteLine("Long task failed: " + ex);
        }

        lock(Sync) {
            IsLongTaskRunning = false;
        }
    });
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы