Bạn không cần phải ngừng đăng ký trong trường hợp bình thường.
Sự kiện thuê bao không thể ngăn chặn sự xuất bản (testClass
) từ được thu thập, nhưng ngược lại có thể xảy ra. Tôi không thể thấy bất cứ điều gì giữ hoạt động testClass
, ngoại trừ ObservableCollection
.
testClass.SomeEvent += this.OnSomeEvent;
testClass
là giữ this
sống vì this
được lưu trữ trong danh sách gọi testClass.SomeEvent
's (ví dụ rằng OnSomeEvent
được gọi khi có một SomeEvent
). this
sẽ không giữ testClass
còn sống bằng cách đăng ký sự kiện của testClass
.
Trong đoạn mã sau, các obj
được lấy ra từ bộ sưu tập, và nó được thu gom rác thải mà không hủy đăng ký, bạn có thể thử để chạy mã để xem kết quả:
void Main()
{
var obj = new BackgroundWorker();
obj.DoWork += OnSomeEvent;
var oc = new ObservableCollection<object>{ obj };
WeakReference objRef = new WeakReference(obj);
Console.WriteLine(objRef.IsAlive);
oc.Remove(obj);
obj = null;
GC.Collect();
Console.WriteLine(objRef.IsAlive);
}
private void OnSomeEvent(object sender, DoWorkEventArgs e)
{
Console.WriteLine("work");
}
Output:
Đúng
False
Bạn có thể xem qua số similar question.
Nguồn
2015-08-13 07:27:51
Thnx. Và cách tốt nhất là gì? Tôi đang làm nó trong collectionChanged. – Sasha