मैं विंडोज सीई के लिए प्रोग्राम लिखता हूं जिसे सीरियल पोर्ट के साथ काम करना चाहिए। मैं ऑब्जेक्ट System.IO.Ports.SerialPort का उपयोग करता हूं। सब कुछ ठीक काम करता है लेकिन जब मैं प्रोग्राम बंद करता हूं और इसे फिर से खोलता हूं, तो मुझे त्रुटि मिलती है: पोर्ट उपयोग में है! अंत में मैं लिखता हूँ:

port.close()
port.dispose()

और अगर मैं इसे जोड़ता हूं:

System.GC.collect() 

.. से सब कुछ काम करना शुरू कर देता है

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

क्या कोई कृपया मदद कर सकता है?

0
Racky 12 अप्रैल 2011, 15:17
बहुत देर से टिप्पणी लेकिन आप using (SerialPort p = new SerialPort()) के साथ प्रयास कर सकते हैं। यह ऑब्जेक्ट को स्वचालित रूप से बंद और निपटाना होगा।
 – 
i486
23 फरवरी 2015, 11:50

3 जवाब

सबसे बढ़िया उत्तर

यह हो सकता है कि पोर्ट ऑब्जेक्ट का स्वामित्व वाली वस्तु का निपटारा नहीं किया गया हो या अभी भी एक संदर्भ बनाए रखा गया हो। यह समझाएगा कि क्यों system.gc.collect() के बाद यह काम करता है।

0
MarcelDevG 12 अप्रैल 2011, 15:31
मुझे यह समझ आ गया। लेकिन जब मैं इसे अपने प्रोग्राम के नवीनतम कमांड के रूप में उपयोग करता हूं तो कलेक्टर काम क्यों नहीं करता है? मेरे प्रोग्राम में एक मॉड्यूल और सब मेन () है। इसके अंत में मैं कलेक्टर चलाता हूं लेकिन बंदरगाह अभी भी खुले हैं :(
 – 
Racky
12 अप्रैल 2011, 15:56
मुझे शायद समाधान मिल गया। वीबी शायद वस्तुओं के साथ काम नहीं करता है जैसा कि मैं ओओपी में उम्मीद करता हूं। तो मैं मुख्य() विधि के अंत में सभी बंदरगाहों को मैन्युअल रूप से नष्ट कर देता हूं। लेकिन जैसा कि मैं वीबीनेट और विजुअल स्टूडियो को अधिक से अधिक समझ रहा हूं, मुझे यह कम और कम पसंद है :( ... उदाहरण के लिए सार रूप एक अच्छी कहानी है :)
 – 
Racky
12 अप्रैल 2011, 16:59
"वीबी शायद वस्तुओं के साथ काम नहीं करता है जैसा कि मैं ओओपी में उम्मीद करता हूं" मुझे यह वीबी नहीं लगता, लेकिन .net ढांचा। और विंडोज सीई भी एक और परत जोड़ता है।
 – 
MarcelDevG
13 अप्रैल 2011, 01:28
"इसके अंत में मैं कलेक्टर चलाता हूं लेकिन बंदरगाह अभी भी खुले हैं"। निपटान सामग्री की तुलना में ctacke का उत्तर अधिक सही हो सकता है, हालांकि दोनों मुद्दे प्रासंगिक हो सकते हैं।
 – 
MarcelDevG
13 अप्रैल 2011, 01:31

यहां कुछ संभावित संभावनाएं हैं। सबसे पहले, सिर्फ इसलिए कि आप बंद कहते हैं, इसका मतलब यह नहीं है कि बंदरगाह भौतिक रूप से जारी किया गया है - यह सी में भी सच है। यह यूएआरटी की स्थिति पर निर्भर करता है और वास्तविक ड्राइवर कैसे लिखा गया था इस पर बहुत कुछ निर्भर करता है। पोर्ट को जारी करने वाले वास्तविक ड्राइवर के पास कॉल करने में समय लग सकता है। मेरा मानना ​​है कि यह वही है जो आप वास्तव में देख रहे हैं क्योंकि आप वास्तव में अपने पोर्ट इंस्टेंस को नष्ट करने के लिए फाइनलाइज़र की प्रतीक्षा करने के बजाय मैन्युअल रूप से बंद कर रहे हैं और इसे पूरी तरह से बंद कर दें - इसमें और भी अधिक समय लगेगा।

बेशक यह मानता है कि आपका क्लोज कॉल वास्तव में चलाया जा रहा है। यदि ऐसा नहीं है, तो आपको यह समझने की आवश्यकता है कि प्रबंधित कोड में ऑब्जेक्ट फ़ाइनलाइज़ेशन कैसे काम करता है। इसका OOP से कोई लेना-देना नहीं है, इसका इस बात से लेना-देना है कि मेमोरी कैसे प्रबंधित की जाती है। जब कोई वस्तु दायरे से बाहर हो जाती है और उसकी कोई जड़ें (संदर्भ) नहीं होती हैं तो यह संग्रह के लिए उपलब्ध होती है, लेकिन इसका मतलब यह नहीं है कि इसे तुरंत जारी किया जाता है। वास्तव में यह अंतिम रूप से चलने से पहले काफी समय हो सकता है, खासकर यदि ऐप चलना जारी रखता है।

1
ctacke 12 अप्रैल 2011, 17:55

आप इसे बंद करने और इसे खोलने के बीच कब तक प्रतीक्षा कर रहे हैं? MSDN के अनुसार:

किसी भी आवेदन के लिए सर्वोत्तम अभ्यास कुछ समय के लिए प्रतीक्षा करना है पहले बंद करें विधि को कॉल करने के बाद ओपन विधि को कॉल करने का प्रयास, as पोर्ट तुरंत बंद नहीं किया जा सकता है।

0
Chris Haas 12 अप्रैल 2011, 17:19
नमस्कार। समय की देरी महत्वपूर्ण नहीं थी। प्रोग्राम में मैं port.open() port.close() port.dispose() system.GC.collect() को कॉल कर सकता हूं
 – 
Racky
13 अप्रैल 2011, 10:03
नमस्कार। समय की देरी महत्वपूर्ण नहीं थी। कार्यक्रम में मैं "पंक्ति" में port.open() port.close() port.dispose() system.GC.collect() को कॉल कर सकता हूं और यह काम करता है। समस्या यह है कि प्रोग्राम इस बंदरगाह के विनाशक को कॉल नहीं कर सकता जहां मैं निपटान() और एकत्रित() का उपयोग करता हूं। यही दिक्कत है। मुझे लगता है कि यह इस तथ्य के कारण हो सकता है कि मेरे कार्यक्रम में कोई मुख्य वर्ग नहीं बल्कि एक मुख्य मॉड्यूल है। तो मैं मॉड्यूल के अंत में विनाशक मैनुअल को कॉल करता हूं और यह अब काम करता है।
 – 
Racky
13 अप्रैल 2011, 10:09