2016-06-01 5 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

これは2番目のコードサンプルです。 –

+0

.axhxハンドルの場合と同じですか? –

関連する問題