tôi sử dụng phương pháp sau đây trong một đoạn mã sản xuất:.NET: Tôi có cần giữ tham chiếu đến WebClient khi tải xuống không đồng bộ không?
private void DownloadData(Uri uri)
{
WebClient webClient = new WebClient();
DownloadDataCompletedEventHandler eh = null;
eh = delegate(object sender, DownloadDataCompletedEventArgs e)
{
webClient.DownloadDataCompleted -= eh;
((IDisposable) webClient).Dispose();
OnDataDownloaded();
};
webClient.DownloadDataCompleted += eh;
webClient.DownloadDataAsync(uri);
}
Tôi bây giờ lo lắng rằng một khó khăn để tái tạo lỗi có thể được gây ra bởi WebClient
dụ là thu gom rác thải trước khi sự kiện DownloadDataCompleted
được gọi là: sau khi thoát khỏi phương pháp DownloadData()
của tôi, không có tham chiếu rõ ràng đối tượng WebClient
, do đó có thể xảy ra một cách đáng tin cậy.
Vì vậy, câu hỏi của tôi là: điều này có thể xảy ra thực tế không? Tôi không thể tái tạo vấn đề, vì vậy có thể có một số vấn đề nội tại xảy ra ngăn không cho đối tượng WebClient
bị thu gom rác thải (ví dụ: đối tượng có thể tự đăng ký với đối tượng chung ở đâu đó trong khi chờ phản hồi).
Mã đang chạy trên .NET 2.0 nếu điều đó tạo ra bất kỳ sự khác biệt nào.
Bạn đương nhiên đúng là câu hỏi quan trọng là liệu người được ủy thác có thu gom rác hay không. Và có, ta nên nghĩ rằng hệ thống hoàn thành IO cần giữ một tham chiếu (gián tiếp) cho đại biểu. Nhưng có vẻ như hoàn toàn không thể là tham chiếu này có thể là một WeakReference. –
Yup, không phải là không thể. Nhưng tôi sẽ * hy vọng * đó sẽ được ghi lại (vì nó là cho Timer). –