मैं सी # में एक ऐप लिख रहा हूं जो कुछ उपकरणों के साथ संवाद करने के लिए SerialPort
कक्षा का उपयोग करता है। अब बड़ी समस्या यह है कि मैं हर समय सामना कर रहा हूं कि वहां संसाधनों को सही तरीके से कैसे मुक्त किया जाए, क्योंकि पहले से ही इस्तेमाल होने वाले सीरियल पोर्ट का उपयोग करने का प्रयास करते समय आपको तुरंत अपवाद मिलता है।सीरियल पोर्ट को ठीक से
के बाद से सामान्य रूप से जीसी काम मैं थोड़े विचारों और क्या प्रयास करने के लिए से बाहर कर रहा हूँ के सबसे का ध्यान रखना चाहिए ...
मुख्य रूप से मैं 2 बातें जो (मेरे तर्क में) काम करना चाहिए की कोशिश की। मैं सत्र आधारित संचार का उपयोग करता हूं, इसलिए मैं प्रत्येक संचार से पहले और बाद में OpenPort
और ClosePort
विधि को कॉल करता हूं - इसलिए बंदरगाह बंद होना चाहिए। इसके अलावा मैंने बंदरगाह को बाद में बंद करने के लिए अपनी ऑब्जेक्ट को सेट करने का प्रयास किया है - लेकिन फिर भी मुझे UnauthorizedAccessExceptions
हर समय मिलता है - हालांकि मुझे 100 प्रतिशत यकीन है कि SerialPort.Close()
विधि को कॉल किया गया है।
क्या आप बंदरगाहों को मुक्त करने के किसी भी बेहतर तरीके से जानते हैं, इसलिए मैं उस अपवाद को रोकना बंद कर देता हूं?
संपादित करें: जवाब लेकिन निपटान() सामान काम नहीं कर रहा के लिए धन्यवाद - मैं कोशिश की थी कि इससे पहले कि - शायद मैं कुछ हालांकि इसलिए यहाँ गलत कर रहा हूँ एक उदाहरण है कि मेरे कोड लगता है:
class clsRS232 : IDisposable
{
public void clsRS232()
{
Serialport port = new Serialport("COM1",9600,Parity.none,8,Stopbits.one);
}
public void openPort()
{
port.Open();
}
public void sendfunc(string str)
{
port.Write(str);
}
public string readfunc()
{
port.ReadTo("\n");
}
public void Dispose()
{
port.Dispose();
}
}
अब जब भी मैं RS232 संचार मैं कैलोरी की जरूरत है:
तो यह मेरी आवरण वर्ग होगा: लेकिन काम नहीं करता है या तो - यह वास्तव में काफी की तरह Øyvind सुझाव दिया है, हालांकि मैं अभी IDisposable
जोड़ा है इस तरह ला नया उदाहरण:
clsRS232 test = new clsRS232;
test.openport();
test.sendfunc("test");
test.Dispose();
लेकिन वह कुछ भी नहीं बदलता है - मैं अभी भी UnauthorizedAccessExceptions के बहुत सारे मिल - और यदि अन्य पुरुष सही था (serialport श्रेणी के निपटान() केवल SerialPort.Close जिसमें ()) - ठीक है तो मुझे लगता है कि मैंने वास्तव में अपने पहले के दृष्टिकोण से कुछ भी नहीं बदला है, जहां मेरे पास फ़ंक्शन कॉल बंद था(); अपने जवाब के लिए
धन्यवाद - अभी भी आप इस तरह अपने कोड लिखना चाहिए, समाधान :)
तेज उत्तर के लिए धन्यवाद लेकिन मैं वास्तव में ऐसा नहीं कर सकता, क्योंकि मैं ने अपनी खुद की कक्षाओं में अपनी खुद की विधियों को लपेट लिया है, जिसे मैं सीरियलपोर्ट संचार के लिए उपयोग करता हूं - वे सभी एक बंदरगाह का उपयोग करते हैं, जिसे कक्षा में पहली बार बुलाया जाता है - इसलिए यदि मैं इसे ऐसा करना चाहता हूं तो मैं बंदरगाह का उपयोग करने वाली हर विधि में इस तरह के एक ब्लॉक को लिखना चाहता हूं? – Lorenz
क्या आप कक्षा बनाते समय बंदरगाह को खोलना चाहते हैं, और जब सभी परिचालन किए जाते हैं तो इसे बंद करें, या आप प्रत्येक ऑपरेशन से पहले और बाद में बंदरगाह से कनेक्शन खोलना और बंद करना चाहते हैं? –
पहला वाला - मेरा रैपर क्लास इसके कन्स्ट्रक्टर के माध्यम से सीरियलपोर्ट का एक उदाहरण शुरू करता है - इसके बाद इसे भेजने/प्राप्त करने के लिए कई विधियों के माध्यम से उपयोग किया जा सकता है, लेकिन एक बार जब मैं अपना खुद का करीबी() फ़ंक्शन (जिसे इस समय SerialPort.Close कहते हैं)()) मैं चाहता हूं कि सीरियलपोर्ट फिर से स्थापित होने के लिए पूरी तरह से मुक्त हो। खोलने और बंद करने से पहले और प्रत्येक ऑपरेशन के बाद काम नहीं करेगा क्योंकि उदाहरण के लिए मैंने कुछ लिखने के बाद बंदरगाह बंद कर दिया होगा और कुछ प्राप्त करने के लिए इसे फिर से खोल दिया होगा -> बफर चला जाएगा ... – Lorenz