2011-06-26 15 views
16

मैं हाल ही में .NET और C# से बात करने के लिए R.NET का उपयोग कर प्रयास कर रहा हूं। यह अब तक बहुत अच्छी तरह से जा रहा है, लेकिन मैंने एक झगड़ा मारा है जो मुझे हल करने में सक्षम नहीं लगता है।एक अप्रबंधित प्रतिनिधि के लिए कचरा संग्रहण रोकना

मुझे सरल, बुनियादी आदेशों के साथ कोई समस्या नहीं है। मैंने एक साधारण कैलकुलेटर बनाया, और डेटा ग्रिड में डेटा आयात करने के लिए कुछ।

A callback was made on a garbage collected delegate of type 'R.NET!RDotNet.Internals.blah3::Invoke'. This may cause application crashes, corruption and data loss. When passing delegates to unmanaged code, they must be kept alive by the managed application until it is guaranteed that they will never be called.

यह शुरू हुआ जब मैं बार-बार एक पाठ फ़ाइल आयात करने के लिए, बस कुछ परीक्षण करने के लिए करने की कोशिश की: लेकिन अब मैं निम्नलिखित त्रुटि प्राप्त हो रही। मैंने इस त्रुटि को विभिन्न तरीकों से देखा है - पृष्ठों के माध्यम से घूमने के घंटों के बाद, ऐसा लगता है कि इस प्रकार की त्रुटि के कई कारण हैं। समय बीतने के बाद, मैं संभावनाओं को खत्म करने की कोशिश करने के लिए अपने कोड को अधिक से अधिक सरल कार्यों में वापस ले रहा हूं। मुझे अब यह मिला है:

public Form1() 
     { 
      InitializeComponent(); 

      REngine.SetDllDirectory(@"C:\Program Files\R\R-2.13.0\bin\i386"); 
      REngine.CreateInstance("RDotNet"); 

      using (REngine currentEngine = REngine.GetInstanceFromID("RDotNet")) 
      { 
       for (int i = 0; i < 1000; ++i) 
       { 
        currentEngine.EagerEvaluate("test <- " + i.ToString()); 

        NumericVector returned = currentEngine.GetSymbol("test").AsNumeric(); 

        textBox1.Text += returned[0]; 

       } 

      } 

     } 

यह सब टेक्स्टबॉक्स 1 में आगे बढ़ता है। टेक्स्ट। मैं इसे एक मूल्य के रूप में एक बटन प्रेस के साथ परीक्षण के रूप में कर रहा था, लेकिन यह थोड़ी देर के बाद मेरी उंगली दर्द कर रहा था! यह उपरोक्त त्रुटि फेंकने से पहले आम तौर पर प्रेस के भार का प्रबंधन कर सकता है।

पहले यह कोड ठीक लग रहा था - इसलिए मैंने माना था कि मैं जो कुछ भी कर रहा था वह समस्या का कारण था, साथ ही ऊपर उद्धृत त्रुटि का कारण भी था। इसलिए मैंने लूप में रखा है। लूप कई सौ रनों के लिए कोई समस्या नहीं चला सकता है, लेकिन फिर त्रुटि में प्रवेश होता है।

अब, मैंने पढ़ा है कि कचरा कलेक्टर द्वारा इस तरह की त्रुटि को बुलाया जा सकता है जो मैं काम कर रहा हूं साथ में। मैंने उन विभिन्न सुझावों का प्रयास किया है जिन्हें मैंने पढ़ा है, जैसा कि मैं उन्हें समझता हूं। इनमें जीसी.किपलाइव() (कोई किस्मत) का उपयोग शामिल नहीं है, और एक अलग वर्ग में एक निजी क्षेत्र भी बना रहा है जिसे छुटकारा नहीं मिल सकता है। अफसोस की बात यह भी काम नहीं किया।

क्या कोई और चीज है जिसे मैं कोशिश कर सकता हूं? मैं बहुत सी हूं, सी # के लिए बहुत नया हूं इसलिए मैं इस काम को कैसे प्राप्त कर सकता हूं इस बारे में किसी भी पॉइंटर्स की सराहना करता हूं। मैं बहुत अधिक मानता हूं कि सुझाए गए तरीकों के साथ सफलता की कमी (1) मानक सुधारों को लागू करने में मेरी अपनी गलतियों (यह सबसे अधिक संभावना है) या (2) आरएनईटी से जुड़ी एक क्विर्क है जो मैंने किया है समझ में नहीं आया

किसी भी मदद की सराहना की जाएगी!

+2

कहां * बिल्कुल * आपने जीसी रखा था। KeepAlive कॉल? यह सही फिक्स है, लेकिन आखिरी बार इसकी आवश्यकता होने के बाद यह होना चाहिए - विधि सरल होने का अंत है। –

+1

मुझे आपकी विशिष्ट समस्या के बारे में कोई जानकारी नहीं है, लेकिन यह मुझे एक ऐसी स्थिति की याद दिलाता है जिसे मैंने हाल ही में किया था जहां मैंने बार-बार टेक्स्ट फ़ाइल को लिखने की कोशिश की थी। यह ज्यादातर समय काम करता है, उन स्पोरैडिक अवसरों को छोड़कर जहां ओएस ने मेरे अगले लिखने के ऑपरेशन से पहले फ़ाइल कनेक्शन बंद नहीं किया है। मुझे पता है कि आप केवल अपनी फाइल से पढ़ रहे हैं, लेकिन पाठ शायद अभी भी है: फ़ाइल ऑपरेशन की संख्या को कम करने के लिए अपने कोड को इस तरह लिखने का प्रयास करें। दूसरे शब्दों में, फ़ाइल को पढ़ें और इसे लूप के साथ समाप्त होने तक स्मृति में संग्रहीत करें। – Andrie

+1

मैं आपको अप्रबंधित कोड में एक प्रतिनिधि को पास नहीं देखता हूं। क्या आप अपने कोड का वह हिस्सा जोड़ सकते हैं? –

उत्तर

7

आर.नेट में एक बग की तरह दिखता है। आप जो अपवाद देख रहे हैं वह तब होता है जब एक .NET परत अप्रबंधित कोड पर कॉलबैक पास करती है लेकिन फिर प्रतिनिधि को कचरा इकट्ठा करने देता है। मुझे आपके रेपो कोड में कोई प्रतिनिधि उपयोग नहीं दिखाई देता है, इसलिए निष्कर्ष यह है कि यह आरएनईटी में होना चाहिए।

+0

ग्रेट, स्टीफन - धन्यवाद! आप सही हैं, मैंने किसी भी तरह के प्रतिनिधि को फोन नहीं किया, हालांकि मुझे यकीन नहीं था कि मैं बिना महसूस किए ऐसा कर रहा था। सी # के लिए नया होने के नाते, मुझे यकीन नहीं था कि क्या मैं त्रुटि कर रहा था। मैं इसे आरएनईटी मंचों पर पोस्ट करूंगा जो मैंने अभी देखा है और उम्मीद है कि एक फिक्स किया जा सकता है। चीयर्स! – hayward

2

स्टीफन ने सुझाव दिया था, यह पता चला है कि यह आरएनईटी के संस्करण में एक बग था जिसका उपयोग मैं कर रहा था, और जो भी मैं कर रहा था में कोई त्रुटि नहीं थी (जो मेरा मूल अनुमान था, इसलिए यहां पोस्ट करने का मेरा कारण !)। आरएनईटी के लेखक ने आरएनईटी मंचों पर अपनी पोस्ट का जवाब दिया है, और सौभाग्य से इस मुद्दे को हल कर लिया है और आरएनईटी को अपडेट किया है, हालांकि अभी तक एक डीएल के रूप में नहीं है (स्रोत फ़ाइलों को आयात करना काफी आसान है हालांकि)।

मैं पुष्टि कर सकता हूं कि स्रोत फ़ाइलों का नवीनतम संस्करण वास्तव में इस समस्या से ग्रस्त नहीं है। हुर्रे! उन सभी के लिए धन्यवाद जिन्होंने यहां जवाब दिया। यह दुर्भाग्यपूर्ण है कि मैंने अपने सिर को एक साधारण बग पर इतनी देर तक खरोंच कर बिताया, लेकिन जब मैं समाधान ढूंढ रहा था तो अधिक सी #/.NET सामानों को जानने में मददगार था।

संबंधित मुद्दे