2016-06-01 11 views
2

Ich habe einen Endpunkt, der eine Methode ausführt. Ich möchte sicherstellen, dass die Methode nicht ausgeführt wird, während sie ausgeführt wird, wenn ich den Endpunkt mehrmals drücke.Wie kann sichergestellt werden, dass der Endpunkt eine Methode nicht ausführt, wenn sie bereits ausgeführt wird?

Ich stelle mir vor ich kann eine Variable irgendwo im Thread-Pool oder so etwas? Ich bin mir nicht sicher, wie ich das untersuchen soll. Einige Hinweise würden mir gefallen.

Mein Beispiel:

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

Was ist mit den anderen Anforderungen geschehen? Sollten sie Fehler zurückgeben? Auf die Fertigstellung warten und dann selbst an die Reihe kommen? Auf die Fertigstellung warten und dann das Ergebnis teilen? Etwas anderes? –

+0

Eine String-Nachricht zurückzugeben wäre ideal, aber in meinem Fall spielt es keine Rolle. –

+0

@EvaldasRaisutis Sie haben den Punkt des Kommentars verpasst. Es * spielt * eine Rolle und was Sie fragen, missbraucht das Kernverhalten von HTTP und führt definitiv zu IIS-Problemen. Erstens, warum gehen Sie davon aus, dass die Anfragen von derselben Maschine beantwortet werden? In einem Load-Balancing-Szenario, das nicht funktioniert –

Antwort

2

Sie können ein Sperrobjekt erstellen, die Aktion zu gewährleisten, nicht parallel laufen.

Möglicherweise gibt es ein Problem: Diese Methode wird für jeden Benutzer gesperrt, da statische Variablen in allen Sitzungen geteilt werden.

Dieses Verhalten ist möglicherweise beabsichtigt. Wenn Sie die Ausführung für alle Sitzungen blockieren möchten, ist dieser Code in Ordnung. Wenn Sie die Ausführung nur für diesen Benutzer blockieren möchten, indem Sie zulassen, dass die Methode pro Benutzer einmal zur gleichen Zeit ausgeführt wird, müssen Sie das Objekt in den Sitzungsspeicher stellen.

Wenn Sie nur den Client informieren wollen, ist es bereits ausgeführt wird, können Sie auch eine Ausnahme auslösen könnte:

private static bool alreadyExecuting = false; 

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

alreadyExecuting = true; 

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

Wird dies einen Fehler auslösen oder wird auf die Ausführung der Sperre gewartet und dann ausgeführt? Ich würde es vorziehen, dass alle nachfolgenden Endpunkttreffer nur eine Zeichenfolgemeldung zurückgeben, wenn sie die Methode nicht ausführen können (weil sie bereits ausgeführt wird). –

+0

Das ist das zweite Codebeispiel. –

+0

Ist es der gleiche Fall für .axhx-Handles? –