2009-06-24 3 views
11

मैं एक कस्टम .net हार्डवेयर ढांचा तैयार कर रहा हूं जिसका उपयोग अन्य प्रोग्रामर द्वारा कुछ हार्डवेयर को नियंत्रित करने के लिए किया जाएगा। वे हमारे हार्डवेयर ढांचे को पाने के लिए हमारे डीएलएल का संदर्भ जोड़ देंगे। मुझे एक साझा कक्षा की आवश्यकता है जिसे एकाधिक अनुप्रयोगों (प्रक्रियाओं) से एक्सेस किया जाएगा।क्या डीएलएल के अंदर सिंगलटन क्लास प्रक्रियाओं में साझा की जा सकती है?

सिंगलटन पैटर्न मुझे लगता है कि यह आवश्यक है लेकिन यह केवल आपकी प्रक्रिया के अंदर कई धागे के लिए काम करता है। मैं पूरी तरह गलत हो सकता हूं लेकिन यहां वर्तमान में सी # कोड का एक उदाहरण है। मैं यह महसूस करने में मदद नहीं कर सकता कि डिजाइन गलत है। काश मैं अधिक विशिष्ट जानकारी साझा कर सकता हूं लेकिन मैं नहीं कर सकता।

  • मुझे इस बात पर जोर देना चाहिए कि ग्राहक के आवेदन पर मेरा कोई नियंत्रण नहीं होगा। समाधान ढांचे (डीएलएल) के अंदर ही होना चाहिए।

फ्रेमवर्क (साझा DLL)

public class Resources 
{ 
    static readonly Resources m_instance = new Resources(); 

    public string Data; 

    private Resources() 
    { 
     Data = DateTime.Now.ToString(); 
    } 

    public static Resources Instance 
    { 
     get 
     { 
      return m_instance; 
     } 
    } 
} 

टेस्ट आवेदन:

: (अंततः खरीदार ऐप)

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine("Press enter to capture the resource!"); 
     Console.ReadLine(); 

     var resources = Resources.Instance; 
     Console.WriteLine("\r\n{0}: {1}\r\n", Thread.CurrentThread.ManagedThreadId, resources.Data); 

     BackgroundWorker worker = new BackgroundWorker(); 
     worker.DoWork += WorkerDoWork; 
     worker.RunWorkerAsync(); 

     while (worker.IsBusy) 
     { 
      Thread.Sleep(100); 
     } 

     Console.WriteLine("Press enter to close the process!"); 
     Console.ReadLine(); 
    } 

    static void WorkerDoWork(object sender, DoWorkEventArgs e) 
    { 
     var resources = Resources.Instance; 
     Console.WriteLine("\r\n{0}: {1}\r\n", Thread.CurrentThread.ManagedThreadId, resources.Data); 
    } 
} 

पहले शुरू आवेदन के उत्पादन देता है

संसाधन को कैप्चर करने के लिए एंटर दबाएं!

1: 2009/06/24 08:27:34

3: 2009/06/24 08:27:34

प्रेस प्रक्रिया को बंद करने में प्रवेश! संसाधन पर कब्जा करने में प्रवेश

प्रेस: ​​

दूसरा आवेदन के उत्पादन देता है!

9: 2009/06/24 08:27:35

10: 2009/06/24 08:27:35

प्रेस प्रक्रिया को बंद करने में प्रवेश!

निष्कर्ष:

मैं दोनों अनुप्रयोगों कक्षा के पहले इन्स्टेन्शियशन के समय का एक ही स्ट्रिंग लौटाने देखना चाहेंगे।

जैसा कि आप देख सकते हैं कि सिंगलटन प्रक्रिया के अंदर एकाधिक धागे के लिए काम करता है लेकिन प्रक्रियाओं को पार नहीं करता है। शायद यह नहीं किया जा सकता है क्योंकि मुझे कोई समाधान नहीं मिल रहा है।

+0

मैं तनाव होना चाहिए कि मैं लूंगा ग्राहक आवेदन पर कोई नियंत्रण नहीं है। समाधान ढांचे (डीएलएल) के अंदर ही होना चाहिए। –

उत्तर

2

आप अनुप्रयोगों में सिंक करने के लिए सिंगलटन का उपयोग नहीं कर सकते हैं। प्रत्येक अपने स्वयं के आवेदन स्थान में चलता है, और सुरक्षा के मामले में स्मृति/वस्तुओं/आदि तक नहीं पहुंच सकता है। दूसरे से संचार की विधि के बिना (रीमोटिंग की तरह) दोनों को सिंक करने के लिए उन्हें एक तीसरे कार्यक्रम में रिमोट करना होगा।

+0

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

+0

@ hangar18 यह वही प्रश्न है - इसे जीएसी में रखने से कुछ खास नहीं होता है, यह अभी भी एक डीएल है! – markmnl

7

हां कई प्रक्रियाओं में सिंगलटन साझा करना संभव है। हालांकि आपको इस तकनीक को प्राप्त करने के लिए इंटरप्रोसेस संचार का समर्थन करने वाली तकनीक का लाभ उठाने की आवश्यकता होगी।

सबसे लोकप्रिय तकनीकें जो आपको सीधे अपने ऑब्जेक्ट को सीधे साझा करने की अनुमति देती हैं, रिमोटिंग और डब्ल्यूसीएफ हैं।

इनमें से किसी एक के साथ सिंगलटन साझा करने का एक उदाहरण देना एक SO उत्तर के दायरे से बाहर है। लेकिन इनमें से प्रत्येक के लिए वेब पर कई ट्यूटोरियल हैं। या तो प्रौद्योगिकी प्लस सिंगलटन को गुगल करना आपको सही रास्ते पर रखना चाहिए।

2

केविन के उत्तर में जोड़ने के लिए, आपके कक्षा संसाधनों के लिए आपके निर्माता को वास्तव में एक असली सिंगलटन होने के लिए निजी बनाया जाना चाहिए, अन्यथा कोई भी निर्माता वर्ग के माध्यम से संसाधन वर्ग का नया उदाहरण बनाने से रोक नहीं रहा है। यह आपकी समस्या का समाधान नहीं करता है, लेकिन यह सिंगलटन का दुरुपयोग करने से रोकता है।

+0

आप निजी होने के लिए निर्माता के बारे में सही हैं। मैंने नमूना तय किया। –

+0

यह केवल एक उदाहरण है। मैं एक तारीख साझा करने की कोशिश नहीं कर रहा हूँ। मैं हार्डवेयर संसाधन को नियंत्रित करने की कोशिश कर रहा हूं। –

+0

उस मामले में एक फ़ाइल अच्छी नहीं होगी। मेरी गलती। – AlbertoPL

1

बस दो अलग-अलग प्रक्रियाओं से एक अलग असेंबली में सिंगलटन संपत्ति को कॉल करना उस वर्ग के विभिन्न उदाहरण बनाएगा।

लेकिन यदि आप केवल सरल सिग्नलिंग (EventWaitHandle) की आवश्यकता है तो आप आसानी से प्रक्रियाओं के बीच जानकारी साझा कर सकते हैं। नेट Remoting, या अग्नि इंटरप्रोसेस ईवेंट।

[संपादित करें:] यह अपने कॉल करने के लिए एक सिंगलटन की तरह लग रहे बनाने के लिए, आप एक वर्ग है जो आंतरिक रूप से उपयोग करेगा दूरस्थ एक सिंगलटन का दृष्टांत को बेनकाब कर सकते हैं, और फिर उदाहरण लौट पारदर्शी रूप से। यहां एक उदाहरण दिया गया है (मुझे लगता है) करता है कि: http://www.codeproject.com/KB/dotnet/remotingsingleton.aspx

0

ऊपर वर्णित अनुसार इसे करने के तरीके हैं। लेकिन अगर आप डब्ल्यूसीएफ या रीमोटिंग का उपयोग करते हैं तो यह बेकार है। कृपया इंटरप्रोसेस थ्रेड सिंक तकनीकों का प्रयास करें।

अधिक जानकारी के लिए सूत्रण

http://www.albahari.com/threading/

विशेष रूप से देखने के पार प्रक्रिया सिंक यहाँ निर्माण पर ऑनलाइन नि: शुल्क ई बुक पढ़ें ...

http://www.albahari.com/threading/part2.aspx#_Synchronization_Essentials

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