PRB: Tidak bisa membongkar Majelis yang Anda buat dan beban dengan menggunakan script di XSLT

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 316775 - Melihat produk di mana artikel ini berlaku.
Artikel ini telah diarsipkan. Artikel ditawarkan dalam bentuk "apa adanya" dan tidak akan dapat diperbarui lagi.
Artikel ini merujuk kepada Microsoft berikut.NET Framework kelas perpustakaan namespaces:
  • System.io
  • System.xml
  • System.xml.XPath
  • System.xml.XSL
Perbesar semua | Perkecil semua

Pada Halaman ini

GEJALA

Ketika Anda menggunakan elemen <msxsl:script> berulang kali dengan System.Xml.Xslt kerangka, kebocoran memori dapat terjadi dengan volume tinggi Extensible Markup Language (XML) atau Extensible Stylesheet Language (XSL) aplikasi. </msxsl:script>

PENYEBAB

Kelas System.xml namespace mendukung penggunaan skrip tertanam dengan menggunakan elemen naskah dalam transformasi XSL (XSLT) aplikasi. Oleh karena itu, elemen <msxsl:script> memungkinkan Anda untuk memilih bahasa pemrograman (seperti Microsoft Visual C#.NET atau Microsoft Visual Basic.NET) untuk melakukan tugas-tugas tertentu.</msxsl:script>

Fungsi menyatakan terkandung dalam skrip blok. Ketika Anda menggunakan skrip tertanam dengan berkas XSL, Majelis yang berisi Microsoft Intermediate Language (menjalankan) dibuat dan dimuat ke memori. Karena dari batasan desain dalam versi ini dari Microsoft.NET Framework, Anda tidak bisa membongkar itu perakitan dari memori. Hal ini dapat mengakibatkan kebocoran memori jika Majelis dibuat dan dimuat berulang kali atau di loop.

PEMECAHAN MASALAH

Untuk mengatasi masalah ini, tidak berulang kali memuat XSLT dengan script. Mengembangkan aplikasi Anda sedemikian rupa bahwa Anda memuat XSLT sekali dan menggunakan kembali sebanyak yang diperlukan. Praktik ini juga meningkatkan kinerja.

Sebagai contoh, kode berikut kebocoran memori:
For(int i=0;i<1000;i++)
{
      xslt.Load(stylesheet);
      //Do other stuff
      xslt.Transform(doc, null, writer);
}
				
Mengubah kode sebagai berikut untuk memuat XSLT hanya sekali dan menggunakan kembali itu dengan loop:
xslt.Load(stylesheet);
For(int i=0;i<1000;i++)
{

      //Do other stuff
      xslt.Transform(doc, null, writer);
}
				
Kode ini hanya beban Majelis sekali dan tidak kebocoran memori.

TEKNIK PEMECAHAN MASALAH

Membongkar perakitan individu oleh bongkar muat semua aplikasi domain yang mengandung Majelis. Untuk melakukannya, hubungi AppDomain.Unload() metode untuk setiap domain aplikasi yang memiliki Majelis dimuat, atau panggilan UnloadDomain() metode di unmanaged hosting API.

INFORMASI LEBIH LANJUT

Langkah-langkah mereproduksi perilaku

  1. Menciptakan Visual C#.NET aplikasi konsol proyek.
  2. Membuat aplikasi XSLT, dan kemudian tambahkan kode berikut:
    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. Buat file XSLT yang bernama XSLTFile1.xslt, dan kemudian tambahkan kode berikut:
     <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. Membuat sebuah file XML yang bernama XMLFile1.xml, dan kemudian tambahkan kode berikut:
    <?xml version='1.0'?>
    <data>
      <circle>
        <radius>12</radius>
      </circle>
      <circle>
        <radius>37.5</radius>
      </circle>
    </data>
    					
  5. Menyimpan file XML dan XSL dalam map aplikasi.
  6. Melangkah melalui kode. Perhatikan bahwa Majelis dibuat dan dimuat di jendela Output dari Visual Studio.NET.
  7. Buka Monitor kinerja. Perhatikan bahwa byte swasta menampilkan peningkatan dalam memori.

Properti

ID Artikel: 316775 - Kajian Terakhir: 24 Februari 2014 - Revisi: 1.0
Berlaku bagi:
  • Microsoft .NET Framework 4
  • Microsoft .NET Framework 2.0
  • Microsoft .NET Framework 1.0
Kata kunci: 
kbnosurvey kbarchive kbprb kbmt KB316775 KbMtid
Penerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:316775

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com