2010-02-06 27 views
5

Tôi có dòng mã sau đây:Làm thế nào tôi có thể ngăn chặn tập tin .XSLT 7 khóa IIS trong C#

xslt.Load(XmlReader.Create(new FileStream(@"C:\website\TransList.xslt", System.IO.FileMode.Open))); 

xslt.Transform(mydoc.CreateReader(),null, sw); 

Nó hoạt động tốt, nếu tôi dừng dự án và khởi động nó một lần nữa, tôi nhận được lỗi sau:

[System.IO.IOException] = { "quá trình này không thể truy cập các tập tin 'C: \ website \ TransList.xslt'. vì nó đang được sử dụng bởi quá trình khác"}

sau đó tôi có phải goto dòng lệnh và làm một IISRESET để có được, tôi cũng có thể thiết lập lại các hồ bơi ứng dụng, điều này là dễ nhất tại thời điểm này vì đây chỉ là hộp dev của tôi.

Bây giờ tôi có cuộc gọi trong câu lệnh try try, nhưng tôi không thể truy cập đối tượng xslt trong trình xử lý.

Đối tượng xslt dường như không có phương pháp đóng hoặc loại bỏ.

Bộ thu gom rác không bao giờ bị bắn vào nó, có vẻ như vậy.

Bất kỳ ý tưởng nào?

Trả lời

9

Bạn sẽ cần phải đóng FileStream và Reader của bạn, hoặc một cách rõ ràng bằng .Close() hoặc thông qua một tuyên bố sử dụng:

using (FileStream fs = new FileStream(@"C:\website\TransList.xslt", System.IO.FileMode.Open)) 
    { 
    xslt.Load(XmlReader.Create(fs)); 
    using (var reader = mydoc.CreateReader()) 
     { 
     xslt.Transform(reader, null, sw); 
     } 
    } 
+0

Đây cũng là giải pháp chi tiết hơn. Có xếp hạng là + 6 đã được trả lời trước, đưa ra câu trả lời này. –

2

FileStream thực hiện IDisposable và đòi hỏi bạn phải gọi Vứt bỏ để giải phóng nguồn lực bên ngoài cũng như implicit; y gọi close(). Bạn nên bọc bản trình diễn của Filestream trong một khối sử dụng vì nó đảm bảo Dispose được gọi ngay cả khi một ngoại lệ được nâng lên. Tuy nhiên, để trả lời câu hỏi của bạn, vì bạn không đóng luồng, quá trình của bạn, có lẽ quá trình w3wp.exe vẫn có một xử lý trên luồng tệp và cách duy nhất bạn có thể phát hành là đặt lại iis hoặc tái chế nhóm ứng dụng. Để tham khảo trong tương lai, chỉ cần quấn luồng phim trong một khối sử dụng để an toàn.

4

Không cần để tạo ra một cách rõ ràng một FileStream và một XmlReader, nếu bạn biết vị trí tập tin sau đó bạn chỉ có thể vượt qua đó để phương thức Load, sử dụng this overload:

XslCompiledTransform xslt = new XslCompiledTransform(); 
xslt.Load(@"C:\website\Translist.xslt"); 

Nếu bạn nghĩ rằng bạn cần phải tạo một FileStream và một XmlReader sau đó tôi đồng ý với các gợi ý đã được đưa ra, sử dụng câu lệnh 'using' để đóng và xử lý đúng các đối tượng đó.

+0

Cảm ơn bạn, đây là vấn đề. Tôi đã xóa đoạn phim đó và đó là tất cả những gì tôi cần làm. Làm việc như một say mê. –

Các vấn đề liên quan