2009-08-07 38 views
6

Tôi có một ứng dụng cửa sổ đơn WPF đơn giản chứa các hộp văn bản và các nút. Và tôi cũng sử dụng NotifyIcon và DateTimePicker của Windows Forms trong cửa sổ WPF. Làm thế nào tôi có thể xử lý tất cả các điều khiển một cách hiệu quả?Khi nào gọi phương thức Dispose() trong ứng dụng WPF

Trả lời

5

Khó có gì trong WPF có phương thức Dispose. Phần lớn các lớp học đóng gói thông tin được quản lý hoàn toàn. Bạn có thể đính kèm một đối tượng vào cây (ví dụ: thông qua phương thức Children.Add) và bạn có thể xóa lại đối tượng - đó là cách quản lý nhà nước hoạt động. Nó chính xác không phù hợp với mẫu IDisposable, bởi vì khi bạn đã xóa một điều khiển, bạn có thể thêm lại, trong khi Dispose có nghĩa là mãi mãi (mặc dù bạn có thể sử dụng Dispose để quản lý nó ngoài các phương thức Add/Remove).

A discussion about it on the Microsoft forums.

Có một vài điều mà nên được IDisposable nhưng không phải là, như DispatcherTimer, và không có gì để ngăn chặn bạn từ việc thực hiện IDisposable trên lớp của riêng bạn là. Đó là vào bạn khi gọi Dispose; về cơ bản khi bạn biết bạn sẽ không sử dụng đối tượng nữa.

Đối với một số Window bạn chỉ cần gọi Close để đóng và WPF sẽ xử lý mọi thứ khác.

1

Tôi sẽ nói rằng quy tắc tương tự áp dụng trong các ứng dụng WPF như trong bất kỳ ứng dụng .NET nào khác: nếu một đối tượng triển khai IDisposable, bạn nên gọi Dispose khi bạn sử dụng xong. Nếu bạn nạp và dỡ các điều khiển động và chúng không thực hiện IDisposable, chỉ cần đặt bất kỳ tham chiếu nào đến null (và tháo bất kỳ trình xử lý sự kiện nào) là đủ để bộ thu gom rác thực hiện công việc của nó.

0

Nếu điều khiển đó là một phần của một số IContainer (đó là mô hình phổ biến trong .NET) so với điều khiển của bạn, chỉ cần triển khai IDisposable. Do đó Dispose() sẽ được gọi tự động khi đó là thời điểm thích hợp.

0

Tuân thủ CA1001: Cho phép loại sở hữu thực hiện IDisposable.

Từ bỏ Windows Forms cũ, sự thật rằng tất cả các điều khiển là IDisposable. Thực hiện và gọi số Dispose.

sealed partial class MainWindow : IDisposable { 
    readonly IDisposable disposable; 
    public MainWindow() { 
     disposable = ... 
    } 

    public void Dispose() { 
     disposable.Dispose(); 
    } 

    protected override void OnClosed(EventArgs e) { 
     Dispose(); 
     base.OnClosed(e); 
    } 
} 
Các vấn đề liên quan