Ich habe derzeit ein Singleton, das bis zu 10 Sekunden dauern kann, um zu initialisieren. Ich möchte jedoch nicht, dass meine Benutzer für diese Initialisierung bestraft werden. Daher würde ich diese Komponente während des Startvorgangs lieber in einen Hintergrundthread umwandeln. Hier ist, was ich habe:Gemeinsames Muster zum Initialisieren eines Singleton auf einem Hintergrund Thread
Singleton:
public class MySingleton
{
private static MySingleton _instance;
private static readonly object _locker = new object();
private MySingleton()
{
Init();
}
public static MySingleton Instance
{
if(_instance == null) _instance = new MySingleton();
return _instance;
}
public void Init()
{
lock(_locker)
{
if(_instance != null) return;
// long running code here...
}
}
}
Anwendungsstart:
Task.Factory.StartNew(() => MySingleton.Instance.Init());
Dieser Code funktioniert, schützt vor Doppel init, schützt gegen den Rand Fall des Benutzers braucht es, bevor es Initialisierung durchgeführt und wehrt auch gegen jemanden, der vergessen hat, Init() aufzurufen.
Allerdings fühlt es sich aus zwei Gründen ein wenig klobig an: a) Ich gehe beim Start zweimal in die Init-Methode. b) Ich möchte Threading innerhalb des Singleton tun, aber etwas muss die Initialisierung initiieren.
Gibt es eine sauberere/nettere/bessere Methode, damit umzugehen?
Vielen Dank im Voraus für die Hilfe aller.
** BEARBEITEN: Wie in den Kommentaren darauf hingewiesen, wurde Init irrtümlicherweise als privat definiert. Es sollte öffentlich sein und wurde korrigiert.
Sie sollten Ihre Singleton initialisieren [wie predigte von Jon Skeet] (http://csharpindepth.com/Articles/ mit 'Faulen <>' werden General/Singleton.aspx), um die Initialisierung zu entladen, bis das Singleton tatsächlich verwendet wird. –
Jon besagt in diesem Artikel "Meine persönliche Präferenz ist für Lösung 4:", die nicht die Lazy Lösung ist. Bitte lesen Sie den Artikel für seine Argumentation und weitere Informationen. –
@MitchWheat - Heh, ich denke (in den 10+ Zeiten, die ich es gelesen habe) habe ich nie den Artikel nach den Beispielen gelesen. Das wird mir beibringen, meine Zunge zu halten (wahrscheinlich nicht) –