2017-01-03 5 views
0

Ich verwende mvc mit Entity-Framework.Sperren Sie die Methode/den Code für unterschiedliche Benutzer, die gleichzeitig einen anderen Browser verwenden, um auf diese Methode zuzugreifen

Ich habe eine Methode, die beim Klicken auf die Schaltfläche aufgerufen wird. Methode, um den Wert von db zu erhalten. Und ich mache eine Berechnung und subtrahiere den Wert basierend auf meiner Anforderung. Am Ende aktualisiere ich diese Entität mit den neuesten Änderungen.

Wenn ich nicht genug Wert in db für Subtraktion habe, möchte ich die Fehlermeldung an Benutzer "genügend Wert in db" anzeigen. es funktioniert gut für den einzelnen Benutzer.

Aber wenn diese Methode von verschiedenen Benutzern gleichzeitig aus verschiedenen Browser aufgerufen wird, dann funktioniert es nicht.

Ich habe versucht mit Sperre das Objekt oder async erwarten, aber nicht in der Lage, diese Situation zu behandeln. Sperre funktioniert nicht bei Ereignissen, die gleichzeitig von verschiedenen Browsern ausgelöst werden.

Code:

public async Task SaveContainerRoutes(List<ContainerRouteVM> lstCRoute, int cid) 
    { 
     //my code 
    } 

Sperrcode:

public ActionResult SaveContainerRoutes(List<ContainerRouteVM> lstCRoute, int cid) 
    { 
     try 
     { 
      ContainerRouteBL bl = new ContainerRouteBL(); 
      lock (bl) 
      { 
       string note = bl.SaveContainerRoutes(lstCRoute, cid);   
      }  
     } 
     catch (Exception ex) 
     { 
      return Json(new { success = false, message = ex.Message }); 
     } 
    } 

Bitte helfen. Danke im Voraus.

+1

Wo ist der 'in Ihrem Code Lock'? –

+0

Was funktioniert nicht? Gibt es einen Fehler oder eine Abweichung zwischen erwartetem und tatsächlichem Output? Wenn ja, was ist die Diskrepanz? – Sefe

+1

Sie benötigen hierfür einen anderen Mechanismus. Wenn Sie feststellen, * serverseitig *, dass Sie nicht alle Anforderungen haben, müssen Sie eine Antwort an den * Client * zurückgeben, der weitere Daten anfordert. Zu diesem Zeitpunkt ist der serverseitige Code fertig und wird nicht mehr ausgeführt. Wenn Sie verhindern möchten, dass ein anderer Benutzer gleichzeitig auf denselben Code zugreift, haben Sie ein sprödes System. Was passiert, wenn der erste Benutzer seinen Browser einfach öffnet, aber nie antwortet? In jedem Fall ist der serverseitige Code beendet und alle von Ihnen vorgenommenen Sperren werden freigegeben. –

Antwort

1

Declare diese Linie in Klassenstufe

private static Object thisLock = new Object(); 

Verwendung ThisLock in Verfahren

public async Task SaveContainerRoutes(List<ContainerRouteVM> lstCRoute, int cid) 
{ 
    lock(thisLock) 
    { 
     //place use code 
    } 
} 
+0

Danke Gopi, jetzt funktioniert es gut. – manojkumar

Verwandte Themen