2012-03-29 13 views
0

In meiner C# -Anwendung greifen mehrere Clients auf den gleichen Server zu, um einen Client zu einem Zeitpunkt unterhalb des Codes zu verarbeiten. Im Code habe ich die Moniter-Klasse und auch die Queue-Klasse verwendet Leistung.Wenn ich die Monitor-Klasse verwende, dann entferne ich die Queue-Klasse aus dem Code.Thread Monitor Klasse in C#

Manchmal mein Remote-Server-Maschine, wo meine Anwendung als Dienst ausgeführt wird, ist total down.ist der untenstehende Code ist der Grund hinter, coz alle Clients gehen in eine Warteschlange, wenn ich den netstatus -an Befehl mit Eingabeaufforderung überprüfen, für 8 Kunden zeigt es 50 Verbindungen halten in Zeit warten ...

Unten ist mein Code, wo Client den Server acces ...

if (Id == "") 
{ 
    System.Threading.Monitor.Enter(this); 
    try 
    { 
     if (Request.AcceptTypes == null) 
     { 
      queue.Enqueue(Request.QueryString["sessionid"].Value); 

      string que = ""; 

      que = queue.Dequeue(); 
      TypeController.session_id = que; 
      langStr = SessionDatabase.Language; 
      filter = new AllThingzFilter(SessionDatabase, parameters, langStr); 
      TypeController.session_id = ""; 

      filter.Execute(); 
      Request.Clear(); 

      return filter.XML; 
     } 
     else 
     { 
      TypeController.session_id = ""; 
      filter = new AllThingzFilter(SessionDatabase, parameters, langStr); 

      filter.Execute(); 
     } 
    } 
    finally 
    { 
     System.Threading.Monitor.Exit(this); 
    } 
} 
+0

Welcher Typ ist Ihre Warteschlange? Das Sperren wird nicht empfohlen (Siehe hier: http://www.albahari.com/threading/part2.aspx#_Locking) – weismat

+0

Ich habe meine Warteschlange so definiert .... Warteschlange Warteschlange = neue Warteschlange (); – user703526

+0

Warum nicht 'lock (this) {...}' verwenden, es ist kürzer als 'Monitor.Enter (this); versuchen {...} schließlich {Monitor.Exit (this); } '. –

Antwort

1

Sperren diese ziemlich falsch ist, wird es nicht funktionieren überhaupt, wenn jeder Thread eine andere Instanz der Klasse verwendet, in der dieser Code lebt. Es ist nicht t klar aus dem Schnipsel, wenn das der Fall ist, aber das zuerst beheben. Erstellen Sie ein separates Objekt, um die Sperre zu speichern und statisch zu machen oder um denselben Bereich wie das gemeinsame Objekt zu erhalten, das Sie schützen möchten (auch nicht löschen).

Sie könnten immer noch Probleme haben, da dies eher ein Deadlock als ein Rennen klingt. Deadlocks sind mit dem Debugger ziemlich einfach zu behandeln, da der Code stecken geblieben ist und überhaupt nicht ausgeführt wird. Debug + Break All, dann Debug + Windows + Threads. Suchen Sie die Worker-Threads in der Thread-Liste. Doppelklicken Sie auf eins, um es auszuwählen, und verwenden Sie Debug + Call Stack, um zu sehen, wo es stecken geblieben ist. Wiederholen Sie dies für andere Threads. Schauen Sie sich die Stack-Ablaufverfolgung an, um zu sehen, wo eine von ihnen eine Sperre erworben hat, und vergleichen Sie sie mit anderen Threads, um zu sehen, welche Sperre sie blockieren.

Das könnte immer noch schwierig sein, wenn der Deadlock kompliziert ist und mehrere verschachtelte Sperren beinhaltet. In diesem Fall könnte die Protokollierung hilfreich sein. Wirklich schwer zu diagnostizierende Mandelbugs erfordern möglicherweise eine Neuschreibung, die die Menge an Threading verringert.

Verwandte Themen