मैं सी ++ से सी # तक अपेक्षाकृत छोटी सेवा को फिर से लिखने की संभावना की जांच कर रहा हूं। सेवा में दो मुख्य कार्य हैं:क्या मैं कुछ धागे अकेले छोड़ने के लिए .NET जीसी बता सकता हूं?
- थोड़ी देर में HTTP अनुरोध निष्पादित करें। उनमें कई उच्च स्तरीय कार्य शामिल हैं जैसे JSON एन्कोडिंग/डिकोडिंग, बेस 64 एन्कोडिंग/डिकोडिंग, और HTTP अनुरोध स्वयं, जिसके लिए सी ++ अद्भुत नहीं है;
- कई वास्तविक समय, ऑडियो-संबंधित कार्यों को निष्पादित करें जिनमें हार्ड डेडलाइन हैं, जिसके लिए सी # शानदार नहीं है।
रीयल-टाइम कार्यों को एक अलग पुस्तकालय द्वारा संभाला जाता है जो इसकी अपनी थ्रेडिंग सामग्री करता है और बाकी की सेवा के साथ मुश्किल से बातचीत करता है। बाकी की सेवा HTTP अनुरोधों से प्राप्त प्रत्येक डेटा को थोड़ा सा डेटा देती है, हर 5 मिनट या उससे भी ज्यादा।
बात यह है कि वास्तविक समय के हिस्से में कठिन समय सीमा है, इसलिए मैं पुस्तकालय के धागे पर जीसी विराम को वास्तव में बर्दाश्त नहीं कर सकता। अपने कोड के पक्ष में, वेब अनुरोधों के बीच जीसी चलाने के लिए बहुत समय होना चाहिए, लेकिन मैं बर्दाश्त नहीं कर सकता कि यह लाइब्रेरी में डेटा को खिलाने की कोशिश कर रहा है।
I found कि मैं एक महत्वपूर्ण खंड बना सकता हूं जिसमें कचरा कलेक्टर GC.TryStartNoGCRegion()
का उपयोग शुरू नहीं करेगा, जो समस्या का आधा हल करता है।
हालांकि, मुझे अभी भी पता नहीं है कि .NET जीसी को अकेले विशिष्ट थ्रेड छोड़ने का तरीका है जो प्रबंधित कोड नहीं चलाता है। क्या यह संभव है?
देखें [यह पोस्ट] (http://stackoverflow.com/questions/6005865/prevent-net-garbage-collection-for-short-period-of-time)। यह सभी प्रकार की चेतावनियों के साथ आता है। –
@ स्कॉटहैनन, मैंने भी उस पर ठोकर खाई (मैंने इसे जीसी.TryStartNoGCRegion के अनुच्छेद में जोड़ा)। मुझे नहीं लगता कि यह कचरे के संग्रह से धागे को छोड़कर कुछ भी दिखाता है। – zneak
सीएलआर एक धागा निलंबित नहीं कर सकता है जो देशी कोड चलाने में व्यस्त है। न ही ऐसा करना है, इस तरह के कोड चलाते समय कोई वस्तु जड़ें बदल सकती हैं। इसलिए "पूछने" की कोई ज़रूरत नहीं है, बस सुनिश्चित करें कि आपका समय-महत्वपूर्ण कोड देशी कोड है और यह अपनी सामग्री के दौरान एक प्रबंधित विधि पर वापस नहीं लौटाता है और कुछ भी गलत नहीं हो सकता है। –