2012-06-07 30 views
5

प्रश्नों की संख्या, फ़ोरम पोस्ट इत्यादि के आधार पर, ऐसा लगता है कि बीसीएल में टीसीपी क्लाइंट/नेटवर्कस्ट्रीम कार्यान्वयन में आईओ ऑपरेशंस को रद्द करने के लिए सभ्य समर्थन नहीं है। .NET 4.5 में Async विधियों के अतिरिक्त के साथ, रद्दीकरण (या सभ्य टाइमआउट समर्थन) की यह कमी चीजों को और भी निराशाजनक बनाती है क्योंकि यह एक कार्य को रद्द करने के लिए और भी जटिल (असंभव पर निकट) बन जाता है जो IO प्रदर्शन करते समय रद्द करने के लिए अस्वीकार कर देता है ।.NET TcpClient/NetworkStream कार्यान्वयन जो एसिंक ऑपरेशंस का समर्थन करता है और टाइमआउट्स का सम्मान करता है

मैंने कई कार्यान्वयन देखा है जो नेटवर्क ऑपरेशन की निगरानी के लिए अतिरिक्त धागे को स्पिन करते हैं और यदि चीजें गलत होने लगती हैं तो अंतर्निहित धारा को बंद कर दें। यह ऐसी दुनिया में बहुत गंदा लगता है जहां हम एसिंक ऑपरेशंस का उपयोग करके इन संसाधनों को संरक्षित करने की कोशिश कर रहे हैं।

क्या कोई मुझे मार्गदर्शन की दिशा में इंगित कर सकता है क्योंकि नेटवर्क आईओ संचालन को कुशलता से रद्द/समय से निपटने या वास्तव में काम करने वाले एक मजबूत तृतीय पक्ष कार्यान्वयन की दिशा में?

उत्तर

4

आईओ रद्द करना मामूली नहीं है। Vista से शुरू करने पर हमारे पास Cancelio क्षमता है, लेकिन यह एक बिल्कुल नई बात है और ड्राइवरों को इसका समर्थन करने की आवश्यकता है।

व्यावहारिक रूप से बोलते हुए, आप जो कुछ भी कर सकते हैं वह सब कुछ रद्द करने के लिए सॉकेट बंद कर देता है। वैकल्पिक रूप से, आप एक कार्य के चारों ओर एक रैपर फ़ंक्शन को कार्यान्वित कर सकते हैं जो रद्दीकरण टोकन सेट होने पर त्वरित समापन प्रदान करता है। आईओ ऑपरेशन अभी भी जारी रहेगा लेकिन इसका परिणाम त्याग दिया जाएगा। http://social.msdn.microsoft.com/Forums/da-DK/async/thread/54632b19-0e9c-4078-aa59-c4389e75b187

+0

मैंने सोचा था कि CancelIo/CancelIoEx गया ओएस स्तर के कार्यों के बजाय लोगों को लागू करने के लिए ड्राइवरों पर निर्भर/उनका समर्थन,:

यहाँ मुद्दे के बारे में एक गहन चर्चा है? – Andrew

+0

वे Win32 एपीआई हैं जो कर्नेल को कॉल करते हैं जो ड्राइवर को कॉल करते हैं। यदि आप एक बड़ा पठन रद्द करते हैं, तो ड्राइवर को डिस्क को रोकने के लिए सहयोग करके सहयोग करने की आवश्यकता होती है। CancelIO भौतिक प्रभाव है। – usr

+2

इस दिशा में मुझे धक्का देने के लिए धन्यवाद। मैंने पाया कि CancelIo/CancelIoEx ओएस-स्तर थे और ड्राइवर-स्तर समर्थन की आवश्यकता नहीं थी। इसके आस-पास थोड़ा और शोध करने के बाद, मैं इस पोस्ट में आया (मुझे पता नहीं है कि मैंने इसे पहले कैसे याद किया) जो एसिंक आईओ को रद्द करने की चुनौतियों पर चर्चा करता है। ऐसा प्रतीत होता है कि फाइल-आधारित आईओ ओवरहाल पाने के लिए लाइन में है लेकिन नेटवर्किंग नहीं है। http://social.msdn.microsoft.com/Forums/da-DK/async/thread/54632b19-0e9c-4078-aa59-c4389e75b187 – Andrew