Singleton mit Parameter
-
Hey
Ich habe eine graphische Anwendung (Eine C#-Form). Innerhalb dieser Anwendung gibt es 5 Singletons. Ich möchte das zumindest so einrichten (typisch mit "Instance()" usw.). Das Problem ist, dass diese Singletons für Ihre Initialisierung eine Referenz auf die Form brauchen, die die GUI Darstellt.
Ich weiß jetzt nicht wie ich das realisieren soll?
Ich kann ja schlecht der Instanz-Methode ein Parameter "form" mitgeben, dass wäre mies benutzbar. Wie löst man sowas
-
Singleton.Instance().SetForm(myForm1);
Du wirfst dann halt ne Exception, falls die Form noch nicht übergeben wird und du auf selbige draufzugreifen musst.
Ach ja: Vielleicht ist es auch nicht zwingend erforderlich, dass deine Klasse ein Singleton ist.
-
Singleton.Instance().SetForm(myForm1);
Wenn schon dann bitte:
public class Singleton { private static Singleton instance; // ... public Singleton GetInstance(Form form) { instance.SetForm(form); return instance; } }
Ist halt absolut nicht multi-threading-sicher und generell recht "hässlich", aber das liegt u.a. auch am Singleton selbst.
-
GetInstance sollte wenigstens die Instanz erstellen, falls sie nicht existiert.
class Singleton { private static Singleton instance = null; private MyForm form; public static Singleton Instance { get { if(null == instance) instance = new Singleton(); return instance; } } public void SetFormReference(MyForm form) { this.form = form; } }
Wegen Threadsicherheit:
http://www.yoda.arachsys.com/csharp/singleton.htmlUnd im nächsten dot.net Magazin ist ein Artikel über Singletons und deren Implementierung enthalten. Könnte man sich ja kaufen, wenns interessiert.
-
Singletons sind ja auch nicht wirklich für Multithreading geeignet, wenn man ihnen Parameter übergibt. Soll dann der eine Thread mit dem Parameter den der andere übergeben hat arbeiten?
Aber brauchst du wirklich Singletons? Oft werden die ja doch nur als Ersatz für globale Variablen verwendet.
-
RitterDerHaselnuss schrieb:
Singletons sind ja auch nicht wirklich für Multithreading geeignet, wenn man ihnen Parameter übergibt. Soll dann der eine Thread mit dem Parameter den der andere übergeben hat arbeiten?
Aber brauchst du wirklich Singletons? Oft werden die ja doch nur als Ersatz für globale Variablen verwendet.
Ich brauche sie als globale Variablen aber sie machen auch wirklich Sinn. Es soll eben nur EIN Graphic-Device geben. Aber das muss mit der Form verknüpft werden
-
RitterDerHaselnuss schrieb:
Singletons sind ja auch nicht wirklich für Multithreading geeignet, wenn man ihnen Parameter übergibt. Soll dann der eine Thread mit dem Parameter den der andere übergeben hat arbeiten?
[..]Singletons können sind sehr wohl für Multithreading Anwendungen geeignet.
Alles was du machen musst, ist die GetInstance Property deiner Singleton threadsicher zu machen, so dass:- Auch bei (erstmaligem) Aufruf der GetInstance Property aus verschiedenen Threads gleichzeitig nur maximal eine Instanz der Klasse im Speicher liegt.
- Die Instanzmethoden threadsicher machen
Das ganze ist als nicht mehr oder weniger hakelig als bei anderen Anwendungsfällen von Multithreading.
Der Zugriff auf Resourcen erfolgt immer im Kontext des ausführenden Threads (dies ist übrigens auch bei Events der Fall, der Sender ist der Ausführer), deshalb müssen gemeinsame Ressourcen geschützt werden.
Zugriffe auf die GUI Komponente (Winforms) müssen, falls "InvokeRequired" true ist, per BeginInvoke durchgeführt werden, ein direkter Methodenzugriff wirft einen Fehler.
-
Natürlich kann man sie für multithreading verwenden, man sollte dann aber nciht solche sachen machen wie irgendwelche member des singletons vom jeweiligen thread neu zu setzen, dass gibt doch nur chaos.