2012-04-10 7 views
5

Ich debattierte mit einem Freund, der besagt, dass der statische Konstruktor einer Race-Bedingung weichen konnte, da der statische Konstruktor mehrmals aufgerufen werden konnte. Es scheint, dass dies nur in Multi-Threaded-Umgebungen mit hohem Volumen passieren kann. Ist das überhaupt möglich?Race-Bedingung in C# statischen Konstruktor

Ich konnte keine Dokumentation finden, die ihm den Fehler beweisen. Hat jemand dazu einen Einblick?

Danke!

+0

Die Bedingung Rennen kommt, wenn ein neuer Thread etwas tut, das den statischen Konstruktor, während der statische Konstruktor auf einem anderen Thread bereits läuft auslösen würde. Der Thread wird blockiert, bis der statische Konstruktor fertig ist. Der statische Konstruktor wartet jedoch möglicherweise auf den Abschluss dieses neuen Threads. Siehe http://stackoverflow.com/a/8883117/385844 – phoog

Antwort

3

Der statische Konstruktor wird nur einmal pro AppDomain aufgerufen.
ECMA-335 besagt, dass die CLI, dass gewährleisten soll: „Ein Typeninitialisierer genau einmal für einen bestimmten Typ ausgeführt werden soll, sofern nicht ausdrücklich durch Benutzercode namens“

Und ich habe nicht von einer bequemen Möglichkeit gehört, Typinitialisierer in C# aufzurufen.

Sie konnten nur Probleme auftreten, wenn Sie zirkuläre Abhängigkeiten zwischen Typinitialisierer erstellen.
Sehen Sie hier für einen interessanten Artikel zu diesem Thema:
https://msmvps.com/blogs/jon_skeet/archive/2012/04/07/type-initializer-circular-dependencies.aspx)

+0

Perfekt! Danke für die Hilfe. – webber

+0

Sie sollten wissen, dass die Liste und die Liste zwei verschiedene Typen sind. So wird zum Beispiel der statische Konstruktor der Liste zweimal aufgerufen. –

+2

@AenSidhe Da es sich um verschiedene Typen handelt, handelt es sich nicht um den gleichen statischen Konstruktor. Sobald Sie ein Typargument wie int oder string auf die Liste anwenden, wird ein geschlossener Typ erstellt. Die verschiedenen Typen haben auch ihre eigenen statischen Variablen. Der statische Konstruktor vom offenen Typ Liste wird nicht aufgerufen. Weitere Informationen finden Sie in Abschnitt 4.4.2 der [C# -Spezifikation] (http://download.microsoft.com/download/3/8/8/388e7205-bc10-4226-b2a8-75351c669b09/CSharp%20Language%20Specification.doc) Info. – Botz3000

12

Ist das überhaupt möglich?

Nein. Die CLR behandelt dies für Sie und verhindert, dass statische Konstruktoren mehr als einmal aufgerufen werden.

Dies wird in der C# -Sprachenspezifikation mehrfach angegeben. In Abschnitt 3.1 heißt es beispielsweise:

Ein statischer Konstruktor für einen Typ wird höchstens einmal pro Anwendungsdomäne ausgeführt.

+1

Dies ist falsch. Eric gibt ein Beispiel, wie hier: http://StackOverflow.com/A/9792537/351385 – Tergiver

+3

@Tergiver Ich sprach die OP-Anweisung an "könnte einer Race Condition weichen, da der statische Konstruktor mehrfach aufgerufen werden könnte" - It Es ist immer möglich, in jedem Code und an jedem Ort eine eigene Race Condition zu erstellen. Es gibt keine Thread-Sicherheitsgarantien, aber die Spezifikation stellt eine Garantie dar, dass der statische Konstruktor nur einmal aufgerufen wird, so dass * das spezifische Race-Condition-Potential nicht existiert. –

+1

Aber die Frage ist, "Ist es sogar möglich, dass ein cctor mehrmals aufgerufen wird?" Die Antwort lautet: "Ja, das ist möglich." Es ist nur möglich, wenn Sie den Anruf von innerhalb des cctor selbst initiieren, aber es ist tatsächlich möglich. – Tergiver