2009-10-29 21 views
5

Câu hỏi không đồng bộ:EndInvoke() - tùy chọn hay không?

Tôi đã đọc qua mạng LOTS bài viết cho và chống lại Delegate.EndInvoke() là tùy chọn. Hầu hết những bài viết này đều từ 4-5 tuổi. Rất nhiều liên kết chết.

Bất cứ ai có thể giải thích, trong .NET 2.0 - là EndInvoke() thực sự ngăn chặn rò rỉ bộ nhớ không thể tránh khỏi, và nếu có, bạn có thể chỉ định nguyên nhân gây ra sự rò rỉ này không?

Cùng một chủ đề: Nếu EndInvoke() thực sự là phải - tôi tìm cách tốt nhất để triển khai cơ chế Cháy và quên bằng cách sử dụng phương thức gọi lại chạy EndInvoke(). Tôi rất muốn nghe từ bất cứ ai nghĩ khác.

Cảm ơn, O

Trả lời

8

Đối Delegate.EndInvoke, bạn nên gọi nó. Đối với Control.EndInvoke, nhóm WinForms đã thông báo rằng bạn không cần gọi điện thoại. Tôi không biết về tương đương với WPF, nhưng tôi nghĩ rằng đó là một ý tưởng tốt để làm như vậy trừ khi bạn có một số thực sự là lý do chính đáng để tin rằng bạn không phải làm như vậy.

Tôi có một số mã "lửa và quên" cho các đại biểu trong số threading article - khoảng một nửa chiều xuống (tìm kiếm "lửa").

+0

Ý nghĩa của lửa-n-quên là gì? Tôi đã giả định: 1) Nếu bạn làm một BeginInvoke và sử dụng không bỏ phiếu, chờ xử lý hoặc gọi lại, sau đó nó là một phương pháp lửa-n-quên 2) Chỉ có phương pháp trả lại void có thể được sử dụng cho lửa-n-quên để bạn không cần lo lắng về việc sử dụng một trong ba điều trên sau khi thực hiện BeginInvoke. Tôi nghĩ rằng nếu bạn đề nghị sử dụng gọi lại để tránh rò rỉ bộ nhớ, nó không cháy-n-quên nữa. –

+0

Đó chính là câu hỏi của tôi. Nếu hướng dẫn là luôn luôn sử dụng EndInvoke() thì không có tùy chọn cho lửa và quên. Hơi lạ. – tsemer

5

Từ msdn:

Luôn gọi EndInvoke để hoàn cuộc gọi không đồng bộ của bạn.

Tôi khuyên bạn nên làm theo các hướng dẫn, ngay cả khi nó hoạt động mà không bị rò rỉ ngày hôm nay, nó có thể thay đổi vào ngày mai.

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