PRB: Nemôže uvoľniť zostáv, ktoré môžete vytvoriť a načítať pomocou skriptu v XSLT

Preklady článku Preklady článku
ID článku: 316775 - Zobraziť produkty, ktorých sa tento článok týka.
Tento článok bol archivovaný. Je publikovaný v aktuálnej podobe a už nebude aktualizovaný.
Tento článok sa vzťahuje na nasledujúce Microsoft.NET rámec triedy knižnica priestory názvov:
  • System.io
  • System.Xml
  • System.XML.XPath
  • System.XML.xsl
Rozbaliť všetko | Zbaliť všetko

Na tejto stránke

PRIZNAKY

Ak používate <msxsl:script> prvok opakovane s System.Xml.Xslt rámec, pretečenie pamäte môže vyskytnúť s vysokým objemom Extensible Markup Language (XML) alebo Extensible Stylesheet Language (XSL) uplatňovanie. </msxsl:script>

PRICINA

Tried System.Xml priestor názvov podporovať používanie vložené skriptovanie pomocou prvku skript v transformácia XSL (XSLT) aplikácie. Preto <msxsl:script> prvok umožňuje vybrať programovací jazyk (napríklad Microsoft Visual C#.ČISTÁ alebo Microsoft Visual Basic.NET) na vykonávanie určitých úloh.</msxsl:script>

Deklarovaný funkcie sú obsiahnuté v rámci bloky skriptu. Ak používate vstavané skript s súboru XSL, zhromaždenia, ktorý obsahuje Microsoft Intermediate Language (MSIL) vytvorený a načítaný do pamäte. Z dôvodu obmedzenia koncepcie v tejto verzii systému Microsoft.NET Framework, nemôže uvoľniť tejto súpravy z pamäte. To môže viesť k pretečenie pamäte, ak zostavy vytvorené a opakovane, alebo v slučke.

RIESENIE

Ak chcete tento problém vyriešiť, opakovane nenačítavajú XSLT s skript. Rozvoj vašej aplikácie tak, že načítate transformácia XSLT raz a znova toľkokrát podľa potreby. Tento postup tiež zvyšuje výkon.

Napríklad nasledujúci kód netesnosti pamäte:
For(int i=0;i<1000;i++)
{
      xslt.Load(stylesheet);
      //Do other stuff
      xslt.Transform(doc, null, writer);
}
				
Zmena kódu takto na načítanie XSLT len raz a znova v slučku:
xslt.Load(stylesheet);
For(int i=0;i<1000;i++)
{

      //Do other stuff
      xslt.Transform(doc, null, writer);
}
				
Tento kód len načíta zhromaždenie raz a nie je úniku pamäte.

RIEŠENIE

Uvoľniť jednotlivé zhromaždeniu vykládky všetky žiadosť domén, ktoré obsahujú zhromaždenia. Vykonáte to volanie AppDomain.Unload() metóda pre každú žiadosť doméne, ktorá má zhromaždenie naložené alebo hovor UnloadDomain() metóda na nespravovaná hosťovaní API.

DALSIE INFORMACIE

Kroky na reprodukovanie tohto problému

  1. Vytvoriť Visual C#.NET konzoly aplikácií project.
  2. Vytvorte žiadosť XSLT a potom pridajte nasledujúci kód:
    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. Vytvoriť súbor XSLT, s názvom XSLTFile1.xslt a potom pridajte nasledujúci kód:
     <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. Vytvorenie súboru XML s názvom XMLFile1.xml a potom pridajte nasledujúci kód:
    <?xml version='1.0'?>
    <data>
      <circle>
        <radius>12</radius>
      </circle>
      <circle>
        <radius>37.5</radius>
      </circle>
    </data>
    					
  5. Súbory XML a XSL uložte do priečinka aplikácie.
  6. Kroku pomocou kódu. Všimnite si, že zostavy sú vytvorené a naložené v okne výstup programu Visual Studio.NET.
  7. Otvorte sledovanie výkonu. Všimnite si, že súkromné bajtov zobrazí zvýšenie v pamäti.

Vlastnosti

ID článku: 316775 - Posledná kontrola: 24. februára 2014 - Revízia: 1.0
Informácie v tomto článku sa týkajú nasledujúcich produktov:
  • Microsoft .NET Framework 4.0
  • Microsoft .NET Framework 2.0
  • Microsoft .NET Framework 1.0
Kľúčové slová: 
kbnosurvey kbarchive kbprb kbmt KB316775 KbMtsk
Strojovo preložené
DÔLEŽITÉ: Tento článok bol preložený pomocou softvéru na strojový preklad od spoločnosti Microsoft, nie prekladateľom. Spoločnosť Microsoft ponúka články preložené prekladateľmi aj strojovo preložené články, vďaka čomu máte možnosť prístupu ku všetkým článkom databázy Knowledge Base vo svojom jazyku. Strojovo preložený článok však nie je vždy perfektný. Môže obsahovať chyby týkajúce sa slovnej zásoby, syntaxe alebo gramatiky, podobne ako cudzinec môže robiť chyby, keď rozpráva vašim jazykom. Spoločnosť Microsoft nenesie zodpovednosť za akékoľvek nepresnosti, chyby alebo škody spôsobené akýmkoľvek nepresným prekladom obsahu alebo jeho použitím zo strany zákazníkov. Spoločnosť Microsoft softvér na strojový preklad pravidelne aktualizuje.
Pokiaľ chcete vidieť anglickú verziu článku, kliknite sem: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