मैंने SerialPort
वर्ग और ThreadPool.QueueUserWorkItem
या Task
एस का उपयोग कर अपने सी # .Net 4.0 एप्लिकेशन में एक रोचक समस्या में भाग लिया है।सीरियलपोर्ट संचार के लिए नेट थ्रेड बनाम थ्रेडपूल बनाम कार्य
समस्या केवल तब होती है जब मैं 2 या अधिक सीरियल पोर्ट्स का उपयोग करता हूं। प्रत्येक सीरियल पोर्ट का अपना सूत्र में चलाता है कि मैं 3 में से 1 तरीकों से बनाने के लिए:
new Thread(DoSerialCommX)
ThreadPool.QueueUserWorkItem(DoSerialCommX)
new Task(DoSerialCommX, TaskCreationOptions.LongRunning).Start()
समस्या समझने के लिए, मैं अपने DoSerialCommX
विधि बनाई पढ़ने के लिए और लूप में हमेशा के लिए धारावाहिक बंदरगाह को लिखें। ऐसा कुछ ऐसा दिखता है: (मैं वास्तव में अपने असली कार्यक्रम में ऐसा नहीं कर रहा हूं। यह सिर्फ मेरे परीक्षण कार्यक्रम से एक स्निपेट है जो समस्या को अलग करता है और दिखाता है)।
private void DoSerialCommX()
{
SerialPort port = new SerialPort("ComX", 9600);
port.Open();
while(true)
{
//Read and write to serial port
}
}
अगर मैं किसी भी विधि 2 या 3, धारावाहिक संचार stutters का उपयोग करें और मैं कई संचार समय समाप्ति प्राप्त करते हैं। अगर मैं विधि 1 का उपयोग करता हूं, तो सब अच्छा है। साथ ही, मुझे यह उल्लेख करना चाहिए कि यह केवल मेरे इंटेल एटम आधारित पीसी पर होता है। डेस्कटॉप पीसी में कोई समस्या नहीं है।
मुझे पता है कि थ्रेड पूल थ्रेड का उपयोग करता है, और डिफ़ॉल्ट रूप से Task
थ्रेड पूल का उपयोग करता है। और मुझे पता है कि थ्रेड पूल वास्तव में अल्पकालिक परिचालन के लिए है। लेकिन मैंने TaskCreationOptions.LongRunning
का उपयोग करने का प्रयास किया, जिसे मैंने थ्रेड पूल का उपयोग करने के बजाय समर्पित धागे को जन्म दिया था, लेकिन यह अभी भी काम नहीं कर रहा था।
तो प्रश्न:Thread
इस स्थिति में इतना खास बनाता है? क्या Thread
के बारे में कुछ है जो आईओ संचालन के लिए बेहतर अनुकूल बनाता है?
संपादित करें: जवाब अब तक कि मैं एक कभी न खत्म होने की प्रक्रिया के लिए ThreadPool या कार्यों का उपयोग करने के लिए कोशिश कर रहा हूँ ग्रहण करने के लिए लग रहे हैं। मेरे असली आवेदन में यह मामला नहीं है। मैं केवल समस्या को दर्शाने के लिए ऊपर दिए गए कोड में कभी-कभी समाप्त होने वाला लूप का उपयोग नहीं कर रहा हूं। मुझे वास्तव में जानने की जरूरत है कि क्यों Thread
काम करता है और ThreadPool
और Task
नहीं। उन लोगों के बारे में तकनीकी रूप से अलग क्या है जो सीरियल संचार को हिचकी का कारण बनेंगे?
मुझे लगता है कि यह एक मूर्ख सवाल है, लेकिन आप> = 25 धागे को प्रबंधित करने की कोशिश नहीं कर रहे हैं, है ना? – Jeff
@ जेफएन 825, नहीं, प्रति सीरियल पोर्ट में केवल 1 धागा है, और मैं अधिकतम 4 धारावाहिक बंदरगाहों में उपयोग कर रहा हूं। – Verax
1 और 3 समान हैं। –