2016-06-01 3 views
2

У меня есть конечная точка, которая запускает метод. Я хочу, чтобы этот метод не выполнялся во время его запуска, когда я несколько раз ударял конечную точку.Как убедиться, что конечная точка не выполняет метод, если он уже запущен?

Я предполагаю, что могу установить переменную где-то в пуле потоков или что-то в этом роде? Я не уверен, как это сделать. Некоторые из них будут оценены.

Мой пример:

namespace Website.Import 
{ 
    public class ImportProducts : IHttpHandler 
    { 
     private static bool running = false; 
     public void ProcessRequest(HttpContext context) 
     { 
      context.Response.ContentType = "application/json"; 

      if (running) 
      { 
       throw new Exception("Already running"); 
      } 

      running = true; 

      try 
      { 
       var repo = new MemoryRepository(); 

       var productImporter = new ProductImporter(repo); 
       var groupImporter = new GroupImporter(repo); 
       var discountImporter = new DiscountImporter(repo); 
      } 
      finally 
      { 
       running = false; 
      } 

      context.Response.Write("Done"); 

     } 

     public bool IsReusable 
     { 
      get 
      { 
       return true; 
      } 
     } 
    } 
} 
+1

Что должно произойти с другими запросами? Должны ли они возвращать ошибки? Подождите завершения и затем сделайте свой поворот? Подождите завершения, а затем поделитесь результатом? Что-то другое? –

+0

Возвращение строкового сообщения было бы идеальным, но, честно говоря, в моем случае это не имеет значения. –

+0

@EvaldasRaisutis вы пропустили точку комментария. Это важно, и то, что вы просите, злоупотребляет основным поведением HTTP и, несомненно, приведет к проблемам IIS. Во-первых, почему вы предполагаете, что запросы будут обслуживаться одним и тем же * машиной *? В сценарии балансировки нагрузки, который не будет работать –

ответ

2

Вы можете создать объект блокировки для обеспечения действия не запускается параллельно.

private static object lockObject = new object(); 

lock (lockObject) 
{ 
    // your code 
} 

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

Это поведение может быть преднамеренным. Если вы хотите заблокировать выполнение для всех сеансов, этот код в порядке. Если вы хотите заблокировать выполнение только для этого пользователя, позволяя методу запускать один раз в одно время для пользователя, вы должны поместить объект в хранилище сеансов.

Если вы просто хотите, чтобы сообщить клиенту, что уже работает, вы можете также бросить исключение:

private static bool alreadyExecuting = false; 

if (alreadyExecuting) 
{ 
    throw new Exception("Already running"); 
} 

alreadyExecuting = true; 

try 
{ 
    // your code 
} 
finally 
{ 
    alreadyExecuting = false; 
} 
+0

Будет ли это выдавать ошибку или будет ждать завершения блокировки и последующего выполнения? Я бы предпочел, чтобы любые последующие удары конечной точки просто возвращали строковое сообщение, если они не могут запустить метод (из-за того, что он уже запущен) –

+0

Это второй пример кода. –

+0

Это тот же случай для ручек .axhx? –

 Смежные вопросы

  • Нет связанных вопросов^_^