बाइट [] को अनपिन करना जो स्वचालित रूप से .NET सॉकेट सर्वर में पिन किया गया था

मेरे पास एक एसिंक्रोनस सॉकेट सर्वर है। मुझे एक ऐसी समस्या का सामना करना पड़ा है जहां समस्याग्रस्त ग्राहक और नेटवर्क घटनाओं को पुन: पेश करने में कठिनाई होती है, जिससे पिन प्राप्त करने के लिए बाइट [] की पागल संख्या होती है। चूंकि ग्राहकों को संभालने के लिए सभी थ्रेडिंग अंतर्निहित हैं (मैं BeginAcceptClient का उपयोग करता हूं, और मैं स्पष्ट रूप से तत्काल तत्काल थ्रेड के बजाय कॉलबैक का उपयोग करता हूं) मैं पिनिंग प्रक्रिया को नियंत्रित नहीं करता हूं। "अंतर्निहित थ्रेडिंग" से मेरा मतलब है कि धागे सीधे मेरे द्वारा उत्पन्न नहीं होते हैं, लेकिन रनटाइम द्वारा मेरे आवेदन की मेजबानी करते हैं।

किसी भी दर पर यह पोस्ट में उत्तर दिखाता है कि ऑब्जेक्ट्स को अनपिन कैसे करें। क्या मैं आगे बढ़ता हूं और मेरे बाइट [] के अपने पिन को पिन करने के दृश्यों के पीछे ओवरराइड करना संभव है, स्टार्टअप के दौरान BeginRead और unpin करें?

धन्यवाद।

2
जोड़ा संपादित
विचारों: 1

2 उत्तर

आपके द्वारा लिंक की गई पोस्ट में जवाब पूरी तरह से गलत है (मैंने अभी एक टिप्पणी छोड़ दी है)। केवल जब अंतिम पिनिंग हैंडल (अधिक सामान्य: पिनिंग "कारण" क्योंकि जीसीएचंडल्स की तुलना में अन्य कारण हैं) हटा दिया गया है वस्तु ऑब्जेक्ट है। आप अनपिनिंग को मजबूर नहीं कर सकते हैं। वह बहुत असुरक्षित होगा। आप सुरक्षित प्रबंधित कोड का उपयोग असुरक्षित चीजों को करने के लिए कर सकते हैं जो सुरक्षा समस्या भी है!

वैसे भी, वस्तु के पिनिंग को रोकने की कोशिश करने के लिए यह आपके लिए समझ में नहीं आता है। यहां तक ​​कि यदि यह संभव था, जो यह नहीं है, तो आपकी प्रक्रिया यादृच्छिक समय पर दुर्घटनाग्रस्त हो जाएगी! सॉकेट शुद्धता के लिए पिनिंग पर निर्भर करता है। यह कारण के बिना ऐसा नहीं करता है।

समाधान कहीं और है:

  1. एप्लिकेशन स्टार्टअप पर सभी बफर बनाएं ताकि सभी बफर स्मृति में सम्मिलित हों। एक बफर पूल का प्रयोग करें।
  2. बड़ी संख्या में बड़े बफर का उपयोग करें और अलग-अलग ग्राहकों को इसके अनुभाग असाइन करें।

एक छोटी तरफ ध्यान दें: पिनिंग को आपके विचार से अलग तरीके से कार्यान्वित किया जाता है। पिनिंग एक झंडा नहीं है जिसे आप किसी ऑब्जेक्ट पर चालू और बंद कर सकते हैं। जब आप कुछ पिन करते हैं, तो पहले कुछ खास नहीं होता है। केवल जब जीसी चलता है, तो जीसी नोटिस करता है कि विशेष संपत्ति के साथ संदर्भ हैं जो वे पिनिंग कर रहे हैं। यह वस्तु को स्थानांतरित होने से रोकता है।

4
जोड़ा
बहुत अच्छे धन्यवाद।
जोड़ा लेखक kmarks2, स्रोत

मैं सुझाव दूंगा कि पिन/अनपिन पर ध्यान केंद्रित करने के बजाय आप अपने सभी सॉकेट कॉल को एक अलग ऐपडोमेन से करें। तब आप, जब आप 'निष्क्रिय/सुरक्षित' बिंदु पर हों, तो उस ऐपडॉमेन को एक अच्छी स्थिति में मेमोरी रीसेट करने के लिए अनलोड और पुनः लोड करें।

1
जोड़ा
वह सिर्फ एक मैनुअल जीसी कर सकता था जो सभी अप्रयुक्त बफर को भी साफ़ करेगा। एक एपडोमेन को बंद करना जीसी के संबंध में कोई नई क्षमता नहीं जोड़ता है। जीसी प्रक्रिया-वैश्विक है।
जोड़ा लेखक usr, स्रोत
आप मान रहे हैं कि हैंडल-रिसाव हैं। बीसीएल सॉकेट कार्यान्वयन में निश्चित रूप से कोई नहीं है, और वह खुद को पिनिंग नहीं कर रहा है। वैसे भी, एपडोमेन को बंद करना सॉकेट डिस्कनेक्ट करता है।
जोड़ा लेखक usr, स्रोत
जीसी प्रक्रिया-वैश्विक है, लेकिन ऐपडोमेन को साफ़ करने से उस डोमेन के सभी फाइनलरों को कॉल किया जाएगा; जिसमें से एक उम्मीद है, जीसीएचंडल पर नि: शुल्क कॉल कर सकता है जो अभी भी बफर धारण कर रहा है। यह प्रश्न में कोड पर निर्भर करता है, लेकिन यह जीसी के अगले स्वीप पर इकट्ठा करने के लिए सरणी को मुक्त कर सकता है।
जोड़ा लेखक GWLlosa, स्रोत
मैं सहमत हूँ; ऐप को बंद करना डोमे सॉकेट को डिस्कनेक्ट करेगा। लेकिन किसी को कुछ लीक करना चाहिए; चूंकि किसी और ने स्मृति को अनपिन करने के लिए पिन किया है, मुश्किल/त्रुटि प्रवण है, मुझे लगता है कि आप जो उम्मीद कर सकते हैं वह है कि आप यह सुनिश्चित करने के लिए ऐपडोमेन को साफ़ करना चाहते हैं कि बफर को साफ करने के लिए कोई और बेहतर स्थिति में है। यह माना जाता है कि बफर आपके नियंत्रण में नहीं हैं।
जोड़ा लेखक GWLlosa, स्रोत