Archiv des Tags ‘MethodImplAttribute’

Einfacher Weg für Methodensynchronisation

Sonntag, den 7. September 2008

Manchmal (sehr oft) kann es kompliziert werden Methoden zu synchronisieren. Sollten wir aber zu der Schlussfolgerung kommen, dass nur ein Thread eine Methode einer Klasse zu einem bestimmten Zeitpunkt ansprechen/ausführen darf. So gibt es eine einfache Möglichkeit die Methode zu synchronisieren.

Mit dem MethodImplAttribute aus dem System.Runtime.CompilerServices namespace kann man das Laufzeitverhalten der CLR beeinflussen. Das MethodImplAttribute akzeptiert einen Enumerator als Paramater mit dem Namen MethodImplOptions.

MethodImplOptions hat ein Feld mit dem Namen Synchronized. Dies teilt dem Compiler mit, dass nur ein Thread die Methode ausführen darf. Dies ist wie mit der Verwendung des Keywords lock, jedoch wir die ganze Methode gelockt.

public class Demo
{
[MethodImpl(MethodImplOptions.Synchronized)]
public void MethodToSyncronize()
{
}
}

Grosses ABER:

  • Dieses Attribute bringt den ausführenden Thread dazu das Lock zu behalten bis die Methode zurückkehrt. Kann das Lock früher gelöst werden, so sollte die Monitor Klasse oder das C# lock statement genutzt werden (besser lock statement!).
  • Das Locken von Instanzen oder Typen mit dem Synchronized flag ist nicht empfohlen für öffentliche (public) Typen. Dies weil ein anderer Code oder Caller könnte selber die Locks auf den Typen oder Instanzen einholen. Dies kann zu bösen Deadlocks führen.