2009-01-20 36 views
8

Tôi có thể nghĩ ra một vài cách để giải quyết vấn đề này, nhưng nó khiến tôi phải có một giải pháp thanh lịch hơn nhiều so với những gì tôi đã nghĩ ra.Tháo các bộ xử lý khi vứt bỏ vật thể

Cách thích hợp nhất để một đối tượng tự làm sạch tất cả các trình xử lý sự kiện trước khi được xử lý. Đó là một sự xấu hổ xử lý sự kiện không thể được liệt kê. Về lý thuyết, nó được coi là chính xác hơn cho mã thêm xử lý cho một đối tượng để nhớ để loại bỏ nó hơn giả định đối tượng sẽ làm sạch chính nó lên trước khi nó đi ra khỏi phạm vi không? Không.

Trả lời

9

Về lý thuyết, nó được coi là hơn chính xác cho các mã thêm handler đến một đối tượng để nhớ để gỡ bỏ nó hơn giả định đối tượng sẽ làm sạch bản thân lên trước khi nó đi ra khỏi phạm vi?

Đối với câu hỏi trên, tôi sẽ phải nói có. Lý thuyết cơ bản về các sự kiện là sự kiện firer không chịu trách nhiệm quản lý các trình xử lý riêng của nó; bất cứ ai đã thêm sự kiện nên làm sạch.

+0

Đủ công bằng. Cảm ơn rất nhiều cho một câu trả lời nhanh chóng và hữu ích. – Kivin

10

Có một cách để tránh sự cố thường gặp này với sự kiện - WeakEvent pattern.

+1

Liên kết đã chết, hãy sửa lỗi. –

+0

Liên kết được khắc phục cho .NET Framework 4: https://msdn.microsoft.com/en-us/library/aa970850(v=vs.100).aspx – arni

0

Trình xử lý sự kiện là mối đe dọa lớn nhất đối với việc tiêu thụ bộ nhớ của ứng dụng .NET, đặc biệt nếu bạn bắt đầu sử dụng nó trong ngữ cảnh máy chủ web. Đối với tôi, nó luôn là trách nhiệm của đối tượng gắn liền với deattach. Một đối tượng gắn phải luôn có tuổi thọ nhỏ hơn hoặc bằng nhau như đối tượng mà nó gắn vào, nếu không thì có vấn đề với thiết kế của các sự kiện vì bạn không muốn được thông báo về những thay đổi trong các đối tượng không có ý nghĩa nữa . Nếu tuổi thọ của họ bằng nhau, họ sẽ đi ra khỏi phạm vi với nhau và bạn không cần phải làm bất cứ điều gì, nếu nó là ngắn hơn sau đó nó gắn đối tượng phải tách ra. Trong một ứng dụng web cơ bản, bạn chỉ có 3 loại tuổi thọ, ứng dụng, phiên và trang và các quy tắc rất dễ áp ​​dụng. Trong các ứng dụng phức tạp hơn, điều này đòi hỏi phải suy nghĩ nhiều hơn một chút.

5

Trong thiết kế của tôi tôi khá nghiêm ngặt về việc xác định hợp đồng như:

  • từng mua lại tài nguyên phải được ghép nối với một thông cáo
  • mỗi cuộc gọi để bắt đầu một dịch vụ phải được kết hợp với một cuộc gọi đến dừng dịch vụ
  • mỗi người quan sát mà gắn vào một chủ đề phải tách
  • và vân vân

(hợp đồng đó s không phải là bất thường, giống như bạn phải ghép nối mở và đóng của một tệp hoặc ghép nối các cuộc gọi mới/xóa bằng các ngôn ngữ không sử dụng thu gom rác tự động).

Mỗi hợp đồng này có thể được kiểm tra ở thời gian chạy đến một mức độ nào đó. Ví dụ, một người quan sát tách ra nhiều lần hơn nó đã đính kèm có thể được phát hiện và báo cáo (khẳng định hoặc ngoại lệ tùy thuộc vào tình huống).

Vì vậy, câu hỏi của bạn rằng:

Về lý thuyết, là nó coi hơn chính xác cho các mã thêm handler đến một đối tượng để nhớ để gỡ bỏ nó hơn giả định đối tượng sẽ tự làm sạch lên trước khi nó đi ngoài phạm vi?

Đã bật vị trí. Câu trả lời là Có, và không chỉ trong lý thuyết, nhưng trong thực tế quá. Theo tôi, các hợp đồng này giúp bạn tránh được các lỗi quét dưới thảm.

Quy định theo cách này để suy nghĩ và bạn đang trên đường xây dựng phần mềm thực sự mạnh mẽ.

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