2009-07-28 53 views

Trả lời

8

Nó được thực hiện cho bạn. Hãy xem UnloadRecursive() từ System.Web.UI.Control trong Trình phản xạ, được gọi là ProcessRequestCleanup().

+0

Thx Duncan, đó là bằng chứng thực sự đầu tiên tôi đã nhìn thấy. –

5

Không, bạn không nên gọi Xử lý trên các điều khiển đang được thực hiện. Bạn chịu trách nhiệm đối với các đối tượng Dùng một lần khác mà bạn tạo bên ngoài cấu trúc Điều khiển (FileStreams, v.v.).

Điều này tuân theo nguyên tắc chung .NET: Trang là chủ sở hữu của Điều khiển và do đó yêu cầu phải bỏ thác (rõ ràng) Vứt bỏ cho họ. Đối với mã thực tế, bạn sẽ phải Reflector mã cho Web.UI.Control.

+0

Tôi không nghi ngờ bạn là chính xác. Tôi đang cố gắng thuyết phục một người khác mặc dù và sẽ đánh giá cao bất kỳ tài liệu tham khảo bạn có thể biết rằng sẽ hỗ trợ này. –

+0

Tôi nghĩ rằng bằng chứng tốt nhất trong trường hợp này là thiếu các bài viết về cách làm sạch các điều khiển của bạn (-: Nhưng tôi sẽ chỉnh sửa một chút. –

+0

Henk là chính xác. Bạn cũng không phải "ai khác" đã thấy bất kỳ bài viết nào từ Microsoft trên ASP.NET có bất kỳ "vứt bỏ vòng lặp". Đó là bởi vì nó không cần thiết –

2

Bài viết này trên The ASP.NET Page Life Cycle khẳng định rằng:

"Unload được gọi sau khi trang đã được trả lại đầy đủ, gửi cho khách hàng, và sẵn sàng để được bỏ đi Tại thời điểm này, tính chất trang như đáp ứng và yêu cầu. được dỡ xuống và mọi việc dọn dẹp được thực hiện. "

Tôi sẽ thực hiện việc "dọn dẹp bất kỳ" có nghĩa là xử lý các điều khiển, v.v. Tôi không thể tưởng tượng rằng các nhà thiết kế khung ASP.NET sẽ bỏ qua điều đó và không ai có thể nhận thấy.

1

Giải thích khác nhau, có nhiều phức tạp hơn đối với câu hỏi này hơn là đáp ứng mắt.

Chắc chắn Disposed được gọi, nhưng nó có làm gì không? Nó phụ thuộc.

Nếu bạn đã đăng ký sự kiện Disposed của trang hoặc kiểm soát và đang ngân hàng trên trang đó được gọi theo yêu cầu, bạn có thể ngạc nhiên. Vâng, nói về mặt kỹ thuật ProcessRequestCleanup() gọi nó cho bạn, nhưng có một cái nhìn vào những gì nó thực sự gọi:

public virtual void Dispose() 
{ 
    IContainer service = null; 
    if (this.Site != null) 
    { 
     service = (IContainer) this.Site.GetService(typeof(IContainer)); 
     if (service != null) 
     { 
      service.Remove(this); 
      EventHandler handler = this.Events[EventDisposed] as EventHandler; 
      if (handler != null) 
      { 
       handler(this, EventArgs.Empty); 
      } 
     } 
    } 
    if (this._occasionalFields != null) 
    { 
     this._occasionalFields.Dispose(); 
    } 
} 

Nếu không có một bề mặt thiết kế, mã này về cơ bản không có gì tại thời gian chạy, có nghĩa Disposed xử lý của bạn sẽ không bao giờ thực hiện.

Bài học không dựa trên các trình xử lý Disposed để thực thi theo yêu cầu. Bạn có thể ghi đè lên nó để đảm bảo một cái gì đó thực hiện, nhưng Unloaded là một đặt cược an toàn hơn nhiều.

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