मेरे पास वर्तमान में एक सिंगलटन है, जिसमें आरंभ करने के लिए 10 सेकंड तक लग सकते हैं। हालांकि, मैं नहीं चाहता कि मेरे उपयोगकर्ताओं को इस प्रारंभिक के लिए दंडित (प्रतीक्षा) करना पड़े, इसलिए मैं एप्लिकेशन स्टार्टअप के दौरान पृष्ठभूमि थ्रेड पर इस घटक को बूटस्ट्रैप करना चाहता हूं। यहाँ मैं क्या है:पृष्ठभूमि पैटर्न पर एक सिंगलटन शुरू करने के लिए सामान्य पैटर्न
सिंगलटन:
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...
}
}
}
आवेदन स्टार्टअप:
Task.Factory.StartNew(() => MySingleton.Instance.Init());
इस कोड को काम, डबल init के खिलाफ गार्ड, उपयोगकर्ता के किनारे मामले के खिलाफ गार्ड यह आवश्यकता होगी, इससे पहले कि यह करता है इनिट() को कॉल करने के लिए भूल गए किसी के खिलाफ शुरूआत और गार्ड भी किया।
हालांकि, यह दो कारणों से थोड़ा सा गड़बड़ महसूस करता है: ए) मैं स्टार्टअप पर दो बार इनिट विधि में जा रहा हूं। बी) मैं सिंगलटन के अंदर थ्रेडिंग करना चाहता हूं, लेकिन कुछ प्रारंभ करना शुरू करना है।
क्या इसे संभालने के लिए कोई क्लीनर/अच्छा/बेहतर तरीका है?
हर किसी की मदद के लिए अग्रिम धन्यवाद।
** संपादित करें: टिप्पणियों में बताया गया है कि, इनिट को गलती से निजी के रूप में स्कॉप्ड किया गया था। यह सार्वजनिक होना चाहिए और इसे सही किया गया है।
आप का उपयोग करना चाहिए 'लेज़ी <>' अपने सिंगलटन [के रूप में जॉन स्कीट द्वारा प्रचार] (प्रारंभ करने में http://csharpindepth.com/Articles/ सामान्य/सिंगलटन.एएसपीएक्स) प्रारंभिकरण को तब तक ऑफ़लोड करने के लिए जब तक कि सिंगलटन वास्तव में उपयोग नहीं किया जाता है। –
जॉन उस लेख में कहता है "मेरी निजी प्राथमिकता समाधान 4 के लिए है:" जो आलसी समाधान नहीं है। कृपया उनके तर्क और अधिक जानकारी के लिए आलेख पढ़ें। –
@ मिच व्हाट - हे, मुझे लगता है (10 बार मैंने इसे पढ़ा है) मैंने उदाहरणों के पिछले लेख को कभी नहीं पढ़ा। यह मुझे मेरी जीभ पकड़ने के लिए सिखाएगा (शायद नहीं) –