PRB: Nelze uvolnit sestavení, které vytvoříte a načíst pomocí skriptu v XSLT

Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.

Projděte si také anglickou verzi článku:316775
Tento článek byl archivován. Je nabízen v takovém stavu, v jakém je, a nebude již nadále aktualizován.
Tento článek se týká následujících oborů názvů knihovny tříd Microsoft .NET Framework:
  • System.IO
  • System.XML
  • System.Xml.XPath
  • System.Xml.Xsl
Příznaky
Při opakovaně použít prvek <msxsl:script> s System.Xml.Xslt framework může dojít nevracení paměti s vysokou svazku aplikaci XML (Extensible Markup Language) nebo Extensible Stylesheet Language (XSL).
Příčina
Třídy oboru názvů System.XML podporují použití vloženého skriptování pomocí prvku skript v aplikacích transformace XSL (XSLT). Prvek <msxsl:script> tedy umožňuje zvolit programovací jazyk (například Microsoft Visual C# .NET nebo Microsoft Visual Basic .NET) k provádění určitých úkolů.

Funkce deklarované jsou obsaženy v blocích skriptu. Při použití vloženého skriptu s soubor XSL sestavení, které obsahuje Microsoft zprostředkujících Language (MSIL) vytvořen a načten do paměti. Z důvodu omezení návrhu v této verzi Microsoft .NET Framework nemůže uvolnit z paměti, že sestavení. To může vést k nevracení paměti, pokud jsou vytvořeny a načten opakovaně nebo smyčku sestavení.
Řešení
Chcete-li tento problém vyřešit, opakovaně nenačtou XSLT pomocí skriptu. Vývoj aplikací takovým způsobem načíst XSLT jednou a znovu použít, kolikrát podle potřeby. Tento postup také zvyšuje výkon.

Například následující kód nevrací paměť:
For(int i=0;i<1000;i++){      xslt.Load(stylesheet);      //Do other stuff      xslt.Transform(doc, null, writer);}				
změnit kód způsobem k načtení XSLT pouze jednou a znovu použít ve smyčce:
xslt.Load(stylesheet);For(int i=0;i<1000;i++){      //Do other stuff      xslt.Transform(doc, null, writer);}				
tento kód pouze načte sestavení jednou a není úniku paměti.
Jak potíže obejít
Uvolnit jednotlivé sestavení podle uvolnění všech doménách aplikací, které obsahují sestavení. To provedete volání metody AppDomain.Unload() pro každou doménu aplikace má načíst sestavení nebo volání metody UnloadDomain() na Nespravovaná hostitelských API.
Další informace

Kroky pro reprodukci tohoto chování

  1. Vytvořit projekt Visual C# .NET aplikace konzoly.
  2. Vytvoření aplikace XSLT a poté přidejte následující 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. Vytvořit soubor XSLT s názvem XSLTFile1.xslt a přidejte následující 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. Vytvořit soubor XML s názvem XMLFile1.xml a přidejte následující kód:
    <?xml version='1.0'?><data>  <circle>    <radius>12</radius>  </circle>  <circle>    <radius>37.5</radius>  </circle></data>					
  5. Soubory XML a XSL uložit ve složce aplikace.
  6. Krokovat kód. Všimněte si, že sestavení vytvořen a načten v okně výstup Visual Studio .NET.
  7. Otevřít nástroj Sledování výkonu. Všimněte si soukromé bajty zobrazit zvětšení v paměti.

Upozornění: Tento článek je přeložený automaticky

Vlastnosti

ID článku: 316775 - Poslední kontrola: 02/28/2014 12:04:20 - Revize: 3.2

Microsoft .NET Framework 1.0

  • kbnosurvey kbarchive kbmt kbprb KB316775 KbMtcs
Váš názor
ERROR: at System.Diagnostics.Process.Kill() at Microsoft.Support.SEOInfrastructureService.PhantomJS.PhantomJSRunner.WaitForExit(Process process, Int32 waitTime, StringBuilder dataBuilder, Boolean isTotalProcessTimeout)