मैं एक वेबब्रोसर नियंत्रण के साथ एमएसएचटीएमएल का उपयोग कर रहा हूं क्योंकि यह मुझे उन चीज़ों तक पहुंच प्रदान करता है जो WebBrowser टेक्स्ट नोड्स जैसे नहीं हैं। मैंने यहां और वेब पर कई पोस्ट देखी हैं जहां लोग कहते हैं कि आपको संदर्भित प्रत्येक COM ऑब्जेक्ट के लिए ReleaseComObject
पर कॉल करना होगा। तो, कहते हैं कि मैं यह कर:क्या मुझे हर एमएसएचटीएमएल ऑब्जेक्ट पर रिलीजकॉम ऑब्जेक्ट को कॉल करने की ज़रूरत है?
var doc = myBrowser.Document.DomDocument as IHTMLDocument2;
मैं doc
जारी करने के लिए की जरूरत है? कैसे body
इस कोड में:
var body = (myBrowser.Document.DomDocument as IHTMLDocument2).body;
इन वस्तुओं के रूप में जल्द ही एक RCW है कि उन्हें जारी होगा द्वारा लिपटे के रूप में वहाँ उन्हें कोई और अधिक संदर्भ हैं नहीं कर रहे हैं? यदि नहीं, तो क्या उनमें से प्रत्येक के लिए फाइनलर (निपटान का उपयोग करने के बजाए) के लिए एक रैपर बनाने का अच्छा विचार होगा, जैसे ही कचरा कलेक्टर किक करता है (जैसे कि मुझे मैन्युअल रूप से चिंता करने की आवश्यकता नहीं है उन्हें निपटाना)?
बात यह है कि, मेरे आवेदन में स्मृति रिसाव है और मेरा मानना है कि इससे संबंधित है। एएनटीएस मेमोरी प्रोफाइलर के अनुसार, कार्यों में से एक (एमएसएचटीएमएल ऑब्जेक्ट्स का उपयोग करने वाले कई अन्य लोगों में) जो Microsoft.CSharp.RuntimeBinder.Semantics.LocalVariableSymbol
ऑब्जेक्ट्स के समूह के संदर्भ में हैं जो जेनरेशन 2 में मेमोरी का उपयोग कर ऑब्जेक्ट्स की शीर्ष सूची में हैं, यह एक है:
internal static string GetAttribute(this IHTMLDOMNode element, string name)
{
var attribute = element.IsHTMLElement() ? ((IHTMLElement)element).getAttribute(name) : null;
if (attribute != null) return attribute.ToString();
return "";
}
यह सुनिश्चित नहीं है कि attribute
के बाद से क्या गलत है, केवल एक स्ट्रिंग है।
यहाँ एक और समारोह है कि चींटियों प्रोफाइलर के उदाहरण रिटेंशन ग्राफ पर दिखाया जाता है (मैं FinalReleaseComObject
रों का एक समूह जोड़ा है, लेकिन अभी भी दिखाया गया है):
private void InjectFunction(IHTMLDocument2 document)
{
if (null == Document) throw new Exception("Cannot access current document's HTML or document is not an HTML.");
try
{
IHTMLDocument3 doc3 = document as IHTMLDocument3;
IHTMLElementCollection collection = doc3.getElementsByTagName("head");
IHTMLDOMNode head = collection.item(0);
IHTMLElement scriptElement = document.createElement("script");
IHTMLScriptElement script = (IHTMLScriptElement)scriptElement;
IHTMLDOMNode scriptNode = (IHTMLDOMNode)scriptElement;
script.text = CurrentFuncs;
head.AppendChild(scriptNode);
if (Document.InvokeScript(CurrentTestFuncName) == null) throw new Exception("Cannot inject Javascript code right now.");
Marshal.FinalReleaseComObject(scriptNode);
Marshal.FinalReleaseComObject(script);
Marshal.FinalReleaseComObject(scriptElement);
Marshal.FinalReleaseComObject(head);
Marshal.FinalReleaseComObject(collection);
//Marshal.FinalReleaseComObject(doc3);
}
catch (Exception ex)
{
throw ex;
}
}
मैं ReleaseComObject
जोड़ा है, लेकिन अभी भी समारोह हो रहा है कुछ के लिए संदर्भ आयोजित करना। इसलिए मुझे लगता है सब कुछ ठीक से जारी की गई है
private void InjectFunction(IHTMLDocument2 document)
{
if (null == Document) throw new Exception("Cannot access current document's HTML or document is not an HTML.");
try
{
IHTMLDocument3 doc3 = document as IHTMLDocument3;
IHTMLElementCollection collection = doc3.getElementsByTagName("head");
IHTMLDOMNode head = collection.item(0);
IHTMLElement scriptElement = document.createElement("script");
IHTMLScriptElement script = (IHTMLScriptElement)scriptElement;
IHTMLDOMNode scriptNode = (IHTMLDOMNode)scriptElement;
script.text = CurrentFuncs;
head.AppendChild(scriptNode);
if (Document.InvokeScript(CurrentTestFuncName) == null) throw new Exception("Cannot inject Javascript code right now.");
Marshal.FinalReleaseComObject(scriptNode);
Marshal.FinalReleaseComObject(script);
Marshal.FinalReleaseComObject(scriptElement);
Marshal.FinalReleaseComObject(head);
Marshal.FinalReleaseComObject(collection);
Marshal.ReleaseComObject(doc3);
}
catch (Exception ex)
{
MessageBox.Show("Couldn't release!");
throw ex;
}
}
MessageBox.Show("Couldn't release!");
लाइन कभी नहीं मारा जाता है: यहाँ कैसे मेरे समारोह अब की तरह लग रहा है। यहां बताया गया है चींटियों से पता चलता है:
मुझे पता नहीं क्या है कि साइट कंटेनर बात है।
, आप एक विधि में COM ऑब्जेक्ट है, हमेशा अपवाद फेंकने से पहले उन्हें साफ तो है क्योंकि वे अपवाद फेंकने के बाद साफ नहीं किया जा सकता है ... – prprcupofcoffee