PRB: لا يمكن إلغاء تحميل التجميعات التي قمت بإنشاء وتحميل باستخدام البرنامج النصي في XSLT

هام: تمت ترجمة هذا المقال باستخدام برنامج ترجمة آلية لشركة مايكروسوفت بدلاً من الاستعانة بمترجم بشري. تقدم شركة مايكروسوفت كلاً من المقالات المترجمة بواسطة المترجمين البشر والمقالات المترجمة آليًا وبالتالي ستتمكن من الوصول إلى كل المقالات الموجودة في قاعدة المعرفة الخاصة بنا وباللغة الخاصة بك. بالرغم من ذلك، فإن المقالة المترجمة آليًا لا تكون دقيقة دائمًا وقد تحتوي على أخطاء إملائية أو لغوية أو نحوية، مثل تلك الأخطاء الصادرة عن متحدث أجنبي عندما يتحدث بلغتك. لا تتحمل شركة مايكروسوفت مسئولية عدم الدقة أو الأخطاء أو الضرر الناتج عن أية أخطاء في ترجمة المحتوى أو استخدامه من قبل عملائنا. تعمل شركة مايكروسوفت باستمرار على ترقية برنامج الترجمة الآلية

اضغط هنا لرابط المقالة باللغة الانجليزية316775
تمت أرشفة هذه المقالة. وتظهر "كما هي" ولن يتم تحديثها بعد الآن.
تشير هذه المقالة إلى Microsoft التالية.NET Framework مكتبة الفئة مساحات الأسماء:
  • System.IO
  • System.Xml
  • System.Xml.XPath
  • System.Xml.Xsl
الأعراض
عند استخدام عنصر <msxsl:script> مرارا وتكرارا بإطار System.Xml.Xslt، قد تحدث تسرب ذاكرة بحجم كبير تطبيق لغة التوصيف الموسعة (XML) أو لغة صفحات الأنماط الموسعة (XSL).</msxsl:script>
السبب
الفئات System.Xml مساحة الاسم يعتمد استخدام البرامج النصية المضمنة باستخدام العنصر البرنامج النصي في تطبيقات تحويل XSL (XSLT). لذلك، العنصر <msxsl:script> يسمح لك باختيار لغة برمجة (مثل Microsoft Visual C#.NET أو Microsoft Visual Basic.NET) لتنفيذ بعض المهام.</msxsl:script>

دالات المعلن مضمن في كتل البرنامج النصي. عند استخدام البرامج النصية المضمنة مع ملف XSL، يتم إنشاء تجميع الذي يحتوي على لغة Microsoft المتوسطة (MSIL) وتحميله في الذاكرة. نظراً لوجود قيود تصميم في هذا الإصدار من Microsoft.NET Framework، لا يمكن إلغاء تحميل هذا التجميع من الذاكرة. قد يؤدي هذا إلى حدوث تسرب ذاكرة إذا يتم إنشاء تجميعات وتحميل مرارا وتكرارا أو في حلقة.
الحل
لحل هذه المشكلة، لا يتم تكرار تحميل XSLT باستخدام البرنامج النصي. تطوير التطبيق الخاص بك بطريقة تحميل XSLT مرة واحدة وإعادة استخدامه عدة مرات حسب الحاجة. هذه الممارسة أيضا بتحسين الأداء.

على سبيل المثال، التعليمة البرمجية التالية تسرب الذاكرة:
For(int i=0;i<1000;i++){      xslt.Load(stylesheet);      //Do other stuff      xslt.Transform(doc, null, writer);}				
تغيير الرمز لتحميل XSLT مرة واحدة فقط وإعادة استخدامه في حلقة كما يلي:
xslt.Load(stylesheet);For(int i=0;i<1000;i++){      //Do other stuff      xslt.Transform(doc, null, writer);}				
هذا الرمز فقط تحميل التجميع مرة واحدة وحدوث تسرب الذاكرة.
الحل البديل
إلغاء تحميل تجميع فردية بتفريغ كافة مجالات التطبيقات التي تحتوي على التجميع. للقيام بذلك، اتصل AppDomain.Unload() أسلوب لكل مجال التطبيق قد التجميعات التي تم تحميلها، أو المكالمة UnloadDomain() أسلوب على API استضافة غير المدارة.
معلومات أخرى

خطوات إعادة إنشاء السلوك

  1. إنشاء Visual C#.مشروع "تطبيقات وحدة تحكم الشبكة".
  2. إنشاء تطبيق XSLT ثم قم بإضافة التعليمة البرمجية التالية:
    using System;using System.IO;using System.Xml;using System.Xml.XPath;using System.Xml.Xsl;public class Sample{	private const String filename = "..\\..\\XmlFile1.xml";	private const String stylesheet = "..\\..\\XSLTFile1.xslt";	public static void Main() 	{                for(int i=0;i<1000;i++)                {		XslTransform xslt = new XslTransform();                xslt.Load(stylesheet);		//Load the XML data file.		XPathDocument doc = new XPathDocument(filename);		//Create an XmlTextWriter to write to the console.         		XmlTextWriter writer = new XmlTextWriter(Console.Out);		writer.Formatting = Formatting.Indented;		//Transform the file.		xslt.Transform(doc, null, writer);		writer.Close();                }		System.Console.Read();        	} }					
  3. إنشاء ملف XSLT الذي يدعى XSLTFile1.xslt، وقم بإضافة التعليمة البرمجية التالية:
     <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"    xmlns:msxsl="urn:schemas-microsoft-com:xslt"    xmlns:user="urn:my-scripts">  <msxsl:script language="C#" implements-prefix="user"><![CDATA[     public double circumference(double radius){       double pi = 3.14;       double circ = pi*radius*2;       return circ;     }                  ]] >     <!-- Remove the space between ]] and > in the preceding line. --><!-- The space is inserted because of a publishing constraint. -->   </msxsl:script>  <xsl:template match="data">    <circles>  <xsl:for-each select="circle">    <circle>    <xsl:copy-of select="node()"/>       <circumference>          <xsl:value-of select="user:circumference(radius)"/>               </circumference>    </circle>  </xsl:for-each>  </circles>  </xsl:template></xsl:stylesheet>					
  4. إنشاء ملف XML يسمى XMLFile1.xml، وقم بإضافة التعليمة البرمجية التالية:
    <?xml version='1.0'?><data>  <circle>    <radius>12</radius>  </circle>  <circle>    <radius>37.5</radius>  </circle></data>					
  5. حفظ ملفات XML و XSL في مجلد التطبيق.
  6. للخطو خلال التعليمات البرمجية. لاحظ إنشاء التجميعات وتحميلها في إطار الإخراج من برنامج Visual Studio.NET.
  7. فتح مراقب الأداء. لاحظ أن عرض وحدات البايت الخاصة الزيادة في الذاكرة.

تحذير: تمت ترجمة هذه المقالة تلقائيًا

خصائص

رقم الموضوع: 316775 - آخر مراجعة: 02/28/2014 00:35:39 - المراجعة: 1.0

Microsoft .NET Framework 4.0, Microsoft .NET Framework 2.0, Microsoft .NET Framework 1.0

  • kbnosurvey kbarchive kbprb kbmt KB316775 KbMtar
تعليقات