Как возвращать нужный jsonresult по условию

У меня есть функция b.Func() которая выполняется 7 минут и я хочу чтобы это функция по новой не запускалась пока она выполняется. Я сделал условия в api но оно не работает сам api

[HttpGet]
bool Procc=false;
public async Task<ActionResult> Get()
{
        if(Procc==false)
       {
        Procc=True;
        Binary b=new Bynary();
        await b.Func();
        Procc=false;
        return new JsonResult("Succes");
        }
else
    {
     return new JsonResult("Task processing");
    }
}

И каждый раз при новом запуске он начинает выполнение этой функция хотя предыдущая не закончилась. Пробовал ставить условие внутри функции такой же эффект


Ответы (1 шт):

Автор решения: Anton K

Нужно две модификации:

  1. Переменную Procc сделать static, т.е. должно быть static bool Procc
  2. Проверку и выставление Procc нужно обернуть в lock() чтобы не было проблем с потоками.

В результате будет что-то вроде этого:

   [HttpGet]
   static bool Procc=false;
   static object Lock = new object();
   public async Task<ActionResult> Get()
   {
        // Эта переменная нужна чтобы не удерживать Procc в состоянии lock во время исполнении функции Func()
        bool needExecute;

        lock(Lock)
        {
            if(Procc==false)
            {
                Procc=True;
                needExecute = true;
            }
            else
            {
                needExecute = false;
            }
        }

        if(needExecute == true)
        {
            Binary b=new Bynary();
            await b.Func();

            lock(Lock)
            {
                Procc=false;
            }

            return new JsonResult("Succes");
        }
        else
        {
            return new JsonResult("Task processing");
        }
 }
→ Ссылка