4 Stimmen

Ist Deadlock möglich, wenn Sperren ein globales Objekt in ASP.NET MVC-Anwendung?

Zum Sperren verwende ich ein einzelnes statisches Objekt, das für meine Anwendung global ist:

public class MvcApplication : System.Web.HttpApplication
{        
    public static readonly object AppLock = new object();
    ...
}

Verwendung zum Sperren des Codes:

lock(MvcApplication.AppLock)
{
    ...
}

Lassen wir die Auswirkungen auf die Leistung einmal beiseite. Kann ich zu 100 % sicher sein, dass ich in diesem Fall eine Blockierung vermeiden kann?

12voto

L.B Punkte 110059

Sie können eine Deadlock-Bedingung nicht nur mit einem Lock-Objekt (AppLock) erzeugen Siehe http://en.wikipedia.org/wiki/Deadlock . Aber es ist möglich, mit dieser Art von Codes in Threads

lock(A)
   lock(B)
       DoSomething();

lock(B)
   lock(A)
       DoSomething();

0voto

WhileTrueSleep Punkte 1484

Ich weiß nicht, ob es in ASP.NET möglich ist, aber in Winforms/Wpf können Sie es tun.

Deadlock' mit nur einem gesperrten Objekt?

Ein weiteres Deadlocking-Szenario entsteht beim Aufruf von Dispatcher.Invoke (in einer einer WPF-Anwendung) oder Control.Invoke (in einer Windows Forms-Anwendung) während er im Besitz einer Sperre ist. Wenn die Benutzeroberfläche zufällig eine andere Methode ausgeführt wird, die auf dieselbe Sperre wartet, kommt es genau genau dort. Dies kann oft einfach durch den Aufruf von BeginInvoke statt statt Invoke aufruft. Alternativ kann man die Sperre auch vor dem Aufruf von Invoke aufrufen, obwohl das nicht funktioniert, wenn der Aufrufer die Sperre aufgehoben hat. Wir erklären Invoke und BeginInvoke in Affinität.

Quelle: http://www.albahari.com/threading/part2.aspx

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X