2016-06-01 2 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 문제를 일으킬 것입니다. 먼저 요청이 동일한 * machine *에 의해 제공된다고 가정하는 이유는 무엇입니까? 작동하지 않는로드 균형 조정 시나리오에서 –

답변

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 핸들과 같은 경우입니까? –

관련 문제