C # / C ++ DLLImport को बंद करें या कम से कम इसकी ढेर मेमोरी को हटा दें? [बंद किया हुआ]
मेरे पास एक C # .NET फ्रेमवर्क एप्लिकेशन है जो DLLImport
उपयोगकर्ता द्वारा दी गई फाइलों के एक समूह को पार्स करने और कुछ ऑपरेशन करने के लिए एक अनवांटेड C ++ DLL के माध्यम से कॉल करता है ।
मैं अपने C # एप्लिकेशन पर एक प्रगति बार रखना चाहूंगा, क्योंकि यह फ़ाइल पार्सिंग एक लंबी प्रक्रिया हो सकती है। सबसे अच्छा तरीका है कि मैंने ऐसा करने के लिए एक बार में कुछ फ़ाइलों को पार्स करने के लिए कहा है, और फिर C # कोड पर वापस लौटता हूं ताकि मैं प्रगति बार को अपडेट कर सकूं।
हालाँकि, इसके लिए मुझे C ++ DLL के ढेर पर कुछ मेमोरी आवंटित करने की आवश्यकता है, इसलिए मुझे हर बार C ++ फ़ंक्शन को कॉल करने के लिए सभी 10,000+ फ़ाइल पथ को तर्क के रूप में पारित नहीं करना होगा।
मुझे यकीन नहीं है कि मैंने अपनी पार्सिंग पूरी करने के बाद DLL को बंद कर दिया है। क्या कोई अन्य तरीका है जिससे मैं इस कार्य को पूरा कर सकता हूं कि जब तक चल रहे आवेदन की संपूर्णता के लिए आवंटित किए गए स्मृति में सभी पथ बनाए रखें?
जवाब
चूंकि आपने पुष्टि की है कि फाइलें स्वतंत्र हैं, इसलिए आपको ऑपरेशन को समानांतर करने की कोशिश करनी चाहिए।
प्रक्रिया के निर्माता पक्ष पर, फ़ाइल नामों के साथ एक सूची या एक सरणी सेट करें। यदि सूची बहुत बड़ी हो जाती है (वास्तव में, बहुत बड़ा तो यह उपलब्ध रैम पर जोर देता है), तो आप इसे ब्लॉकिंगकॉलक्शन और एक क्यू के संयोजन के साथ बदलना चाह सकते हैं, इसलिए निर्माता को तब तक छीना जा सकता है जब तक कि प्रसंस्करण पाइप में वस्तुओं की संख्या सीमा से नीचे न हो। ।
इस पाइप के दूसरी तरफ, एक कार्यकर्ता (इनलाइन या अलग श्रमिक धागा) शुरू करें जो या तो क्रमिक रूप से या .As समानांतर () संग्रह से आइटम पढ़ेंगे, और प्रसंस्करण के लिए उन्हें अप्रबंधित पुस्तकालय के पास भेज देंगे।
चूंकि यह एक यूआई एप्लिकेशन है, इसलिए मुझे लगता है कि आपके श्रमिक धागे को अलग होना चाहिए। प्रत्येक संसाधित फ़ाइल पर, प्रगति बार को अपडेट करने के लिए UI फॉर्म पर एक .Invoke () करें।