मैं विंडोज सीई के लिए प्रोग्राम लिखता हूं जिसे सीरियल पोर्ट के साथ काम करना चाहिए। मैं ऑब्जेक्ट System.IO.Ports.SerialPort
का उपयोग करता हूं। सब कुछ ठीक काम करता है लेकिन जब मैं प्रोग्राम बंद करता हूं और इसे फिर से खोलता हूं, तो मुझे त्रुटि मिलती है: पोर्ट उपयोग में है! अंत में मैं लिखता हूँ:
port.close()
port.dispose()
और अगर मैं इसे जोड़ता हूं:
System.GC.collect()
.. से सब कुछ काम करना शुरू कर देता है
लेकिन समस्या यह है कि जब हर पोर्ट के लिए गारबेज कलेक्टर को बुलाया जाता है तो कंप्यूटर अटक जाता है। अगर मैंने कहीं और कलेक्टर का उपयोग करने की कोशिश की, तो यह बंदरगाहों को "एकत्र" नहीं करता है और यदि प्रोग्राम फिर से शुरू होता है तो वे उपयोग किए जाने लगते हैं।
क्या कोई कृपया मदद कर सकता है?
3 जवाब
यह हो सकता है कि पोर्ट ऑब्जेक्ट का स्वामित्व वाली वस्तु का निपटारा नहीं किया गया हो या अभी भी एक संदर्भ बनाए रखा गया हो। यह समझाएगा कि क्यों system.gc.collect() के बाद यह काम करता है।
यहां कुछ संभावित संभावनाएं हैं। सबसे पहले, सिर्फ इसलिए कि आप बंद कहते हैं, इसका मतलब यह नहीं है कि बंदरगाह भौतिक रूप से जारी किया गया है - यह सी में भी सच है। यह यूएआरटी की स्थिति पर निर्भर करता है और वास्तविक ड्राइवर कैसे लिखा गया था इस पर बहुत कुछ निर्भर करता है। पोर्ट को जारी करने वाले वास्तविक ड्राइवर के पास कॉल करने में समय लग सकता है। मेरा मानना है कि यह वही है जो आप वास्तव में देख रहे हैं क्योंकि आप वास्तव में अपने पोर्ट इंस्टेंस को नष्ट करने के लिए फाइनलाइज़र की प्रतीक्षा करने के बजाय मैन्युअल रूप से बंद कर रहे हैं और इसे पूरी तरह से बंद कर दें - इसमें और भी अधिक समय लगेगा।
बेशक यह मानता है कि आपका क्लोज कॉल वास्तव में चलाया जा रहा है। यदि ऐसा नहीं है, तो आपको यह समझने की आवश्यकता है कि प्रबंधित कोड में ऑब्जेक्ट फ़ाइनलाइज़ेशन कैसे काम करता है। इसका OOP से कोई लेना-देना नहीं है, इसका इस बात से लेना-देना है कि मेमोरी कैसे प्रबंधित की जाती है। जब कोई वस्तु दायरे से बाहर हो जाती है और उसकी कोई जड़ें (संदर्भ) नहीं होती हैं तो यह संग्रह के लिए उपलब्ध होती है, लेकिन इसका मतलब यह नहीं है कि इसे तुरंत जारी किया जाता है। वास्तव में यह अंतिम रूप से चलने से पहले काफी समय हो सकता है, खासकर यदि ऐप चलना जारी रखता है।
आप इसे बंद करने और इसे खोलने के बीच कब तक प्रतीक्षा कर रहे हैं? MSDN के अनुसार:
किसी भी आवेदन के लिए सर्वोत्तम अभ्यास कुछ समय के लिए प्रतीक्षा करना है पहले बंद करें विधि को कॉल करने के बाद ओपन विधि को कॉल करने का प्रयास, as पोर्ट तुरंत बंद नहीं किया जा सकता है।
port.open() port.close() port.dispose() system.GC.collect()
को कॉल कर सकता हूं
port.open() port.close() port.dispose() system.GC.collect()
को कॉल कर सकता हूं और यह काम करता है। समस्या यह है कि प्रोग्राम इस बंदरगाह के विनाशक को कॉल नहीं कर सकता जहां मैं निपटान() और एकत्रित() का उपयोग करता हूं। यही दिक्कत है। मुझे लगता है कि यह इस तथ्य के कारण हो सकता है कि मेरे कार्यक्रम में कोई मुख्य वर्ग नहीं बल्कि एक मुख्य मॉड्यूल है। तो मैं मॉड्यूल के अंत में विनाशक मैनुअल को कॉल करता हूं और यह अब काम करता है।
संबंधित सवाल
नए सवाल
windows
Microsoft Windows ऑपरेटिंग सिस्टम के लिए विशिष्ट सॉफ्टवेयर लिखना: एपीआई, व्यवहार, आदि सामान्य विंडो समर्थन OFF-TOPIC है। समर्थन प्रश्न https://superuser.com पर पूछे जा सकते हैं
using (SerialPort p = new SerialPort())
के साथ प्रयास कर सकते हैं। यह ऑब्जेक्ट को स्वचालित रूप से बंद और निपटाना होगा।