PRB: Không thể bỏ nạp hội chúng mà bạn tạo và tải bằng cách sử dụng kịch bản trong XSLT

QUAN TRỌNG: Bài viết này được dịch bằng phần mềm dịch máy của Microsoft chứ không phải do con người dịch. Microsoft cung cấp các bài viết do con người dịch và cả các bài viết do máy dịch để bạn có thể truy cập vào tất cả các bài viết trong Cơ sở Kiến thức của chúng tôi bằng ngôn ngữ của bạn. Tuy nhiên, bài viết do máy dịch không phải lúc nào cũng hoàn hảo. Loại bài viết này có thể chứa các sai sót về từ vựng, cú pháp hoặc ngữ pháp, giống như một người nước ngoài có thể mắc sai sót khi nói ngôn ngữ của bạn. Microsoft không chịu trách nhiệm về bất kỳ sự thiếu chính xác, sai sót hoặc thiệt hại nào do việc dịch sai nội dung hoặc do hoạt động sử dụng của khách hàng gây ra. Microsoft cũng thường xuyên cập nhật phần mềm dịch máy này.

Nhấp chuột vào đây để xem bản tiếng Anh của bài viết này:316775
Bài viết này đã được lưu trữ. Bài viết được cung cấp "nguyên trạng" và sẽ không còn được cập nhật nữa.
Bài viết này đề cập đến Microsoft sau.Không gian tên thư viện lớp của NET Framework:
  • System.io
  • System.xml
  • System.xml.XPath
  • System.xml.XSL
TRIỆU CHỨNG
Khi bạn sử dụng các yếu tố <msxsl:script> nhiều lần với khuôn khổ System.Xml.Xslt, một rò rỉ bộ nhớ có thể xảy ra với một số lượng lớn Extensible Markup Language (XML) hoặc Extensible Stylesheet ngôn ngữ (XSL) ứng dụng.</msxsl:script>
NGUYÊN NHÂN
Các lớp học của các System.xml không gian tên hỗ trợ việc sử dụng các kịch bản nhúng bằng cách sử dụng các yếu tố kịch bản trong các ứng dụng XSL Transformation (XSLT). Vì vậy, các yếu tố <msxsl:script> cho phép bạn chọn ngôn ngữ lập trình (chẳng hạn như Microsoft Visual C#.NET hoặc Microsoft Visual Basic.NET) để thực hiện nhiệm vụ nhất định.</msxsl:script>

Khai báo chức năng được chứa trong kịch bản khối. Khi bạn sử dụng kịch bản nhúng với một tập tin XSL, một hội đồng có chứa ngôn ngữ trung gian Microsoft (MSIL) được tạo ra và được tải vào bộ nhớ. Vì của một hạn chế thiết kế trong phiên bản này của Microsoft.NET Framework, bạn không thể lấy đó lắp ráp từ bộ nhớ. Điều này có thể dẫn đến một rò rỉ bộ nhớ nếu hội đồng khác nhau được tạo ra và được tải nhiều lần hoặc trong một vòng lặp.
GIẢI PHÁP
Để giải quyết vấn đề này, không nhiều lần nạp XSLT với kịch bản. Phát triển ứng dụng của bạn trong một cách như vậy mà bạn tải XSLT một lần và tái sử dụng nó nhiều lần khi cần thiết. Thực hành này cũng cải thiện hiệu suất.

Ví dụ, đoạn mã sau rò rỉ bộ nhớ:
For(int i=0;i<1000;i++){      xslt.Load(stylesheet);      //Do other stuff      xslt.Transform(doc, null, writer);}				
Thay đổi mã như sau để tải XSLT chỉ một lần và tái sử dụng nó trong một vòng lặp:
xslt.Load(stylesheet);For(int i=0;i<1000;i++){      //Do other stuff      xslt.Transform(doc, null, writer);}				
Mã này chỉ tải lắp ráp một lần và không rò rỉ bộ nhớ.
CÁCH GIẢI QUYẾT KHÁC
Lấy một hội đồng cá nhân bởi xếp dỡ tất cả các lĩnh vực ứng dụng có chứa y Cynulliad. Để thực hiện việc này, gọi cho các AppDomain.Unload() phương pháp cho mỗi tên miền ứng dụng đã lắp ráp được nạp, hoặc gọi các UnloadDomain() phương pháp trên lưu trữ API không được quản lý.
THÔNG TIN THÊM

Các bước mô phỏng hành vi.

  1. Tạo một Visual C#.Dự án ứng dụng giao diện điều khiển NET.
  2. Tạo một ứng dụng XSLT, và sau đó thêm mã sau đây:
    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. Tạo một tập tin XSLT được đặt theo tên XSLTFile1.xslt, và sau đó thêm mã sau đây:
     <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. Tạo một tệp XML có tên XMLFile1.xml, và sau đó thêm mã sau đây:
    <?xml version='1.0'?><data>  <circle>    <radius>12</radius>  </circle>  <circle>    <radius>37.5</radius>  </circle></data>					
  5. Lưu các tập tin XML và XSL trong thư mục ứng dụng.
  6. Bước qua các mã. Thông báo rằng các hội đồng khác nhau được tạo ra và được nạp trong cửa sổ đầu ra của Visual Studio.NET.
  7. Mở màn hình hiệu suất. Thông báo rằng các byte tư nhân hiển thị sự gia tăng trong bộ nhớ.

Cảnh báo: Bài viết này được dịch tự động

Thuộc tính

ID Bài viết: 316775 - Xem lại Lần cuối: 02/21/2014 00:44:21 - Bản sửa đổi: 1.0

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

  • kbnosurvey kbarchive kbprb kbmt KB316775 KbMtvi
Phản hồi