Cập nhật 06/08/2009 15:52: Câu trả lời ngắn NO. Câu hỏi gốc:SPWeb.Site, bạn có nên gọi Dispose() trên đó không?
Tôi không thể tìm thấy bất kỳ tham chiếu nào cung cấp hướng dẫn về SPWeb.Site liên quan đến xử lý. Tôi đã trải qua một số các tài liệu phổ biến hơn thông lệ tốt nhất về xử lý đối tượng SharePoint:
- http://www.sharepointdevwiki.com/display/public/When+to+Dispose+SharePoint+objects
- http://msdn.microsoft.com/en-us/library/aa973248.aspx
- http://blogs.msdn.com/rogerla/archive/2008/02/12/sharepoint-2007-and-wss-3-0-dispose-patterns-by-example.aspx
Đáng tiếc là không ai trong số những hướng dẫn này đề cập đến SPWeb.Site. Để cung cấp cho một số bối cảnh, tôi đang viết một API mở rộng nào mà chấp nhận một SPWeb như một tham số để một ví dụ phương pháp:
public static void GetWebPartFromCatalog(this SPWeb web, string webPartName)
{
......
SPSite site = web.Site;
......
**OR** ??
using (SPSite site = web.Site)
{
....
}
}
Tôi đã trông như phương thức Close() trong refelector cho SPWeb, được gọi là bởi SPWeb.Dispose() và không có gì trong đó để chỉ ra trường thành viên SPSite thực tế được xử lý.
Cập nhật: 06/08/2009 13:47
Tại Alex's gợi ý
"Đặt nó trong một vòng lặp chạy 100 lần và sử dụng phím SPRequestStackTrace registry được mô tả trong Troubleshooting SPSite/SPWeb rò rỉ trong WSS v3 và MOSS 2007 để kiểm tra xem mã thử nghiệm của bạn có phải là nguồn gốc của sự cố không. "
Tôi chạy các đoạn mã sau đây bao gồm bên trong một webpart:
for (int i = 0; i < 100; i++)
{
using (SPWeb web = SPContext.Current.Site.OpenWeb(""))
{
SPSite site = web.Site;
Debug.WriteLine(site.Url);
}
}
Không có gì xuất hiện trong SharePoint bản ghi.
Trong khi tôi sẽ ngần ngại đưa ra bất kỳ kết luận thực sự nào từ thí nghiệm ngây thơ này, Nó sẽ gợi ý rằng đó là không phải là cần thiết để xử lý SPWeb.Site. Sẽ rất tuyệt khi nhận được câu trả lời cụ thể từ một người nào đó được thông báo thêm về chủ đề này.
Cập nhật: 06/08/2009 14:52 Được nhắc bởi bình luận của Greg Tôi đã thực hiện các nhiệm vụ của m_Site và nó xuất hiện cuối cùng luôn được chuyển vào SPWeb thông qua các nhà thầu nội bộ. Ví dụ. SPWeb.OpenWeb chuyển qua số số tới SPWeb mới(). Vì vậy, tôi chắc chắn rằng SPWeb.Site nên không được xử lý, thực sự có thể gây ra vấn đề nếu nó được.
Nhìn vào điều này, nó không rõ ràng. Tôi hỏi cùng một câu hỏi như một bình luận cho bài viết của Roger Lamb nhưng không trả lời. –
Theo ý kiến của tôi, và nó chỉ là, một ý kiến, không, bạn không bao giờ phải vứt bỏ đối tượng đó. Tại sao? Vâng, nó được trả về thông qua một tài sản từ một đối tượng khác. Nếu đối tượng kia là dùng một lần, bạn nên vứt bỏ * đó *, và để nó tự chăm sóc tài nguyên của chính nó. Không có gì bạn đọc từ một tài sản nên được xử lý bởi mã của riêng bạn, mà sẽ, với tôi, tạo thành một lỗi trong khuôn khổ đó. –
@ lasse-v-karlsen Tôi đồng ý với bạn 100%, tuy nhiên có rất nhiều điều kỳ quặc trong SharePoint API và bạn thực sự cần phải hiểu chúng hoặc bộ nhớ rò rỉ rủi ro. Vì vậy, trong khi nó có thể là một lỗi trong API tôi muốn hiểu nếu nó có hay không :) –