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
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.
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ó.
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.
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);
}
}
- 1. Phương thức .dispose() có làm được gì không?
- 2. ASP MVC: Khi nào IController Dispose() được gọi là?
- 3. Không thể gọi Dispose?
- 4. Sử dụng process.start trong ứng dụng wpf để gọi một ứng dụng wpf khác
- 5. WPF-Prism Phương thức CanExecute không được gọi là
- 6. Ứng dụng WPF bị bế tắc khi gọi trên Dispatcher
- 7. Phương thức layoutSubviews được gọi là khi nào?
- 8. javascript gọi phương thức nội bộ khi sử dụng jquery
- 9. Chương trình bị treo sau khi gọi Dispose()
- 10. Có phương pháp nào trong appDelegate được gọi khi ứng dụng gặp sự cố không?
- 11. Phương thức gọi bên trong phương thức khác trong javascript?
- 12. Gọi phương thức khi chuỗi kết thúc
- 13. Gọi phương thức mỗi lần trước khi bất kỳ phương pháp nào khác được gọi là
- 14. Gọi phương thức NSTimer
- 15. Phương thức nào được gọi khi một QGraphicsItem được chọn
- 16. Khi nào thì phương thức getView() của ListView được gọi?
- 17. Modal MessageBox trong ứng dụng WPF
- 18. Làm cách nào để xác định phương thức nào được gọi trong phương thức?
- 19. Phương thức ủy quyền khi xóa ứng dụng
- 20. Phương thức gọi trong EJB khi khởi động JBoss
- 21. Khi phương thức AppInitialize được gọi trong ASP.NET?
- 22. Điều nào tốt hơn và khi nào: sử dụng câu lệnh hoặc gọi Dispose() trên IDisposable trong C#?
- 23. phương thức __doPostBack được gọi như thế nào? Phương thức gọi điện ở đâu?
- 24. Bạn phải gọi phương thức "WebSecurity.InitializeDatabaseConnection" trước khi bạn gọi bất kỳ phương thức nào khác của lớp "WebSecurity"
- 25. phương thức gọi khi khởi động máy chủ
- 26. Làm thế nào để gọi phương thức tĩnh trong PowerShell
- 27. RaceOnRCWCleanup khi đóng các ứng dụng WPF
- 28. Các cuộc gọi phương thức trong EL
- 29. Khi nào phương thức hoàn thiện trong đơn vị được gọi?
- 30. Tại sao phương thức Dispose() không có sẵn trên đối tượng IDisposable của tôi?