2011-12-05 10 views
10

मुझे सिंगलटन पैटर्न के साथ कोई समस्या है।सी # सिंगलटन ऑब्जेक्ट के कई उदाहरण

यह वास्तव में अजीब है, लेकिन ऐसा लगता है कि मेरे सिंगलटन पैटर्न के दो या तीन उदाहरण हैं। मेरी वेबसाइट, टाइमर के साथ एक क्रिया साइट है और मैं अपने सिंगलटन ऑब्जेक्ट के साथ उन टाइमर और कीमतों को संभालने में कामयाब रहा हूं।

क्या हो रहा है कि कुछ लोग कुछ कीमतें देखते हैं, और अन्य लोग अलग-अलग नेटवर्कों में हमेशा अन्य कीमतें देखते हैं।

उदाहरण के लिए, मेरे कार्यालय में, मेरे लोग 0.56 सेंट पर कुछ नीलामी देखते हैं, हर कोई एक जैसा देखता है, लेकिन दूसरे नेटवर्क में, उदाहरण के लिए, मेरा घर, मुझे 0.55 सेंट दिखाई देता है और टाइमर के अलग-अलग मूल्य होते हैं।

यह कहकर, मैंने एक GUID उत्पन्न करके और अपनी लॉग फ़ाइल में लॉग इन करके, मेरे सिंगलटन का परीक्षण किया है। यहाँ कुछ कोड

public class Singleton 
{ 
    private static Singleton instance; 
    private static System.Threading.Mutex mutex; 

    System.Guid token; 

    private Singleton() { 
     token = System.Guid.NewGuid(); 
     Logger.Log("New singleton Instance" + token.toString()); 
    } 
    static Singleton() 
    { 
     instance = new Singleton(); 
     mutex = new System.Threading.Mutex(); 
    } 

    public static Singleton Acquire() 
    { 
     mutex.WaitOne(); 
     return instance; 
    } 

    // Each call to Acquire() requires a call to Release() 
    public static void Release() 
    { 
     mutex.ReleaseMutex(); 
    } 

    public void SomeAction() 
    { 
     Logger.Log(token.toString() + " - SomeAction"); 
    } 
} 

इस कोड में है, मैं निर्माता से टोकन उत्पन्न, और एक नया सिंगलटन के निर्माण प्रवेश करें, फिर ... SomeAction विधि में, मैं लॉग इन करें जो कि कार्रवाई कर रही है।

इसके बाद, हमने कुछ परीक्षण किए और लॉग फ़ाइल डाउनलोड की।

मेरे आश्चर्य के लिए, मुझे केवल एक "न्यू सिंगलटन इंस्टेंस ब्लै" दिखाई देता है जो सही है। लेकिन फिर, SomeAction पर कई कॉल अलग-अलग GUIDs के साथ विधि, जो अजीब है।

मैंने जांच की है कि ऑब्जेक्ट केवल स्थिर निर्माता में बनाया गया है, और मैंने यह भी जांच की है कि कहीं भी मैन्युअल निर्माण नहीं है।

अधिक जानकारी के लिए, यह केवल मेरे उत्पादन सर्वर पर होता है, जो एक goDaddy होस्टिंग है। मैंने पूछा है कि मेरी वेबसाइट के लिए एक से अधिक एप्लिकेशन पूल हैं और वे कहते हैं कि केवल एक ऐप पूल है।

+6

सुझाए गए अनुसार अपने सिंगलटन को लागू करने का प्रयास करें [यहां] (http://csharpindepth.com/Articles/General/Singleton.aspx)। –

+0

मैं सोच रहा था कि आपने स्थिर कन्स्ट्रक्टर क्यों बनाया है? – FosterZ

+0

हो सकता है कि आप कुछ निपटान लॉगिंग का उपयोग करके समस्या का निदान कर सकें और हर जगह कैच कैच जोड़ सकें। सौभाग्य। – CodingBarfield

उत्तर

4

आपका सिंगलटन जीवनकाल आईआईएस की वर्तमान कार्यकर्ता प्रक्रिया से जुड़ा हुआ है।

यदि आपके पास एकाधिक कार्यकर्ताओं को कॉन्फ़िगर किया गया है तो सभी अनुरोधों को एक ही प्रक्रिया द्वारा नियंत्रित नहीं किया जाता है और इस प्रकार एक ही सिंगलटन नहीं होता है।

+0

के लिए एक उदाहरण होगा, यह समझ में आता है, मैं जांचूंगा कि मेरे पास कितनी कार्यकर्ता प्रक्रियाएं हैं ... यदि मेरे पास एक से अधिक हैं, तो क्या आप जानते हैं कि मैं वही सिंगलटन उदाहरण कैसे साझा कर सकता हूं? क्या यह संभव है? – varholl

+0

यह निश्चित रूप से मेरी समस्या है, क्योंकि एक से अधिक कार्यकर्ता प्रक्रियाएं हैं जिनमें मेरे एक से अधिक सिंगलटन ऑब्जेक्ट हैं ... दुख की बात यह है कि मैं किसी भी सिंक विधि का उपयोग नहीं कर सकता क्योंकि मैं संदेश कतार या रीमोटिंग का उपयोग नहीं कर सकता .. मैं यह देखने की कोशिश कर रहा हूं कि क्या मैं हर 5 सेकंड सिंक कर सकता हूं लेकिन कुछ मामलों में ... यह प्रतीक्षा करने में बहुत अधिक समय है :( – varholl

0

ऐसा लगता है कि आपका स्थिर निर्माता यह देखने के लिए जांच नहीं करता है कि उदाहरण पहले से ही बनाया गया है या नहीं। की तरह कुछ:

static Singleton() 
    { 
    if (instance == null) 
     { 
     instance = new Singleton(); 
     mutex = new System.Threading.Mutex(); 
     } 
    } 

सुनिश्चित करना चाहिए कि कक्षा में अन्य तरीकों वास्तव में एक ही instance की "उदाहरण" का उपयोग कर रहे हैं।

+4

-1: यह एक [स्थिर कन्स्ट्रक्टर] है (http://msdn.microsoft.com/en-us/library/k9x6w0hc%28v=VS.100%29 .aspx)। इसे केवल एक बार निष्पादित किया जाता है ... –

+0

फिर से: स्थिर रचनाकार केवल एक बार निष्पादित होते हैं। –

+0

एक स्थिर कन्स्ट्रक्टर (http://msdn.microsoft.com/en-us/library/k9x6w0hc%28v=VS.100%29.aspx) केवल एक बार निष्पादित किया जाता है। कृपया सिंगलेट्स (http://www.csharpindepth.com/Articles/General/Singleton.aspx) को लागू करने के बारे में जॉन स्कीट के आलेख पर नज़र डालें। –

2

मुझे यकीन है कि के लिए नहीं कह सकता कि यह आपकी समस्या है, लेकिन इसके लायक जाँच हो सकता है: आप पहले अपने प्रवेश ढांचे initialised है एक उदाहरण बनाते हैं

  • , संदेश कैश्ड हो जाता है, या बस दूर फेंका? मैंने देखा है कि लॉग संदेश अतीत में गायब हो गए हैं क्योंकि लॉगिंग शुरू होने से पहले वे होते हैं।
  • क्या यह संभव है कि आप इस वर्ग वाले असेंबली के कई संस्करणों का संदर्भ दे रहे हों? यह प्रति असेंबली संस्करण वर्ग के एक उदाहरण का कारण बन सकता है, इसलिए देखे गए मान इसे कॉल करने वाले कोड पर निर्भर करते हैं। हालांकि यह विभिन्न भौगोलिक स्थानों से एक ही पृष्ठ तक पहुंचने पर आपके द्वारा अलग-अलग मूल्यों के व्यवहार को समझाएगा।
  • यदि आप यह कर सकते हैं कि unique machine id के कुछ रूपों को लॉग इन करने का भी प्रयास किया जाए, तो यह सत्यापित करने के लिए कि एक मशीन पर चल रहे इस कोड की केवल एक प्रति है। अस्पष्ट व्यवहार को समझने की कोशिश करते समय "किसी पर भरोसा न करें, सबकुछ साबित करें" एक बहुत ही उपयोगी हेरिस्टिक है।
+0

आपके उत्तर के लिए धन्यवाद! मैं लॉग प्रारंभिकता की जांच करूंगा, इसके कारण उन संदेशों को खोने का अर्थ हो सकता है। क्या बिन निर्देशिका में एक ही डीएलएल के एक से अधिक संस्करण हो सकते हैं? मेरा मतलब है कि मेरे पास मेरे बिन फ़ोल्डर पर मेरे सभी डीएलएस नहीं हैं। – varholl

+0

मेरा मानना ​​है कि एक ही निर्देशिका से एक ही असेंबली के कई संस्करणों को लोड करना संभव है, लेकिन फ़ाइलों को नाम बदलने के लिए इसमें कुछ चाल चलती है, इसलिए आपको दुर्घटना से ऐसा करने की संभावना नहीं है। –

1

आपकी वेबसाइट केवल एक एप्लिकेशन पूल का उपयोग कर रही है, लेकिन एक एप्लिकेशन पूल एक से अधिक होस्ट प्रक्रिया को जन्म दे सकता है। अपने एप्लिकेशन पूल के लिए कार्यकर्ता प्रक्रियाओं की संख्या की जांच करें।

1

समस्या यह हो सकती है कि आपके सिंगलटन पैटर्न को आपने लागू किया है थ्रेड सुरक्षित नहीं है। क्योंकि एक वेब ऐप में आपको एक ही समय में चलने वाले एक से अधिक धागे मिलते हैं (कार्यकर्ता प्रक्रियाएं) यह हो सकता है कि दो धागे आपकी कक्षा के दो अलग-अलग उदाहरण बनाते हैं। आपको यह भी विचार करना चाहिए कि आपका वेब ऐप कहां चल रहा है। यदि आपने वेब-फार्म पर अपना वेब ऐप तैनात किया है तो ऐसा हो सकता है कि वेब सर्वर की याद में एक अलग वैरिएबल "लाइव" के रूप में अलग-अलग वेब सर्वर को आपकी कक्षा का एक अलग उदाहरण मिला।

+0

आपके लॉग फ़ाइल में, आपके लॉग फ़ाइल में, मैं एक ही टोकन साझा करने वाले विभिन्न थ्रेड आईडी देखता हूं, इसलिए मुझे नहीं लगता कि यह एक थ्रेड समस्या है .. मैं भी ताले और म्यूटेक्स का उपयोग करके लगभग हर जगह सुरक्षित धागा सुनिश्चित करता हूं! वैसे भी मैं यह सुनिश्चित करने के लिए आगे की जांच करूंगा कि यह थ्रेड सुरक्षित है – varholl

+0

वेब ऐप पर वेब ऐप पर तैनात किए जाने पर भी जांचें। इस मामले में आपके पास प्रत्येक वेब सर्वर –

संबंधित मुद्दे