Tôi sẽ tạo một GUI sẽ có bộ điều khiển được tạo động với các sự kiện được gán cho chúng. Tôi sẽ cần phải thêm và loại bỏ các điều khiển đó trong thời gian chạy. Nó sẽ giống như thế này:biện pháp phòng ngừa để thực hiện để ngăn chặn rò rỉ bộ nhớ do xử lý sự kiện thêm
FlowLayoutPanel.Controls.Clear();
<< add new controls, assigning Click events with += >>
Tôi đã nghe nói rằng giao xử lý sự kiện với + = có thể gây rò rỉ bộ nhớ (specificly hơn, bộ nhớ sẽ không được trả tự do cho đến khi ứng dụng đã thoát). Tôi muốn tránh điều này. Tôi biết tôi có thể viết một số chức năng như ở đây How to remove all event handlers from a control để tìm tất cả các trình xử lý sự kiện và xóa chúng nhưng có vẻ rất phức tạp.
Có cách nào khác không? Việc gọi Dispose có giúp xóa các trình xử lý sự kiện đó không? Bạn có thể phá hủy các đối tượng để buộc bộ nhớ của họ được giải thoát như trong C/C++ không?
Cảm ơn!
PS: Vấn đề là, tôi không biết sự kiện nào cần tách ra. Tôi sẽ tạo nhiều nhãn và thêm các loại sự kiện onclick khác cho họ. Khi thời gian của mình để làm sạch bảng điều khiển bố cục luồng, không có cách nào để biết trình xử lý sự kiện nào được đính kèm với nhãn nào.
Đây là mã ví dụ (_flowLP là một FlowLayoutPanel) - chức năng Refresh() này được chạy nhiều lần trước khi ứng dụng thoát.
private void Refresh()
{
Label l;
Random rnd = new Random();
// What code should i add here to prevent memory leaks
_flowLP.Controls.Clear();
l = new Label();
l.Text = "1";
if (rnd.Next(3) == 0) l.Click += Method1;
if (rnd.Next(3) == 0) l.Click += Method2;
if (rnd.Next(3) == 0) l.Click += Method3;
_flowLP.Controls.Add(l);
l = new Label();
l.Text = "2";
if (rnd.Next(3) == 0) l.Click += Method1;
if (rnd.Next(3) == 0) l.Click += Method2;
if (rnd.Next(3) == 0) l.Click += Method3;
_flowLP.Controls.Add(l);
l = new Label();
l.Text = "3";
if (rnd.Next(3) == 0) l.Click += Method1;
if (rnd.Next(3) == 0) l.Click += Method2;
if (rnd.Next(3) == 0) l.Click += Method3;
_flowLP.Controls.Add(l);
l = new Label();
l.Text = "4";
if (rnd.Next(3) == 0) l.Click += Method1;
if (rnd.Next(3) == 0) l.Click += Method2;
if (rnd.Next(3) == 0) l.Click += Method3;
_flowLP.Controls.Add(l);
l = new Label();
l.Text = "5";
if (rnd.Next(3) == 0) l.Click += Method1;
if (rnd.Next(3) == 0) l.Click += Method2;
if (rnd.Next(3) == 0) l.Click += Method3;
_flowLP.Controls.Add(l);
l = new Label();
l.Text = "6";
if (rnd.Next(3) == 0) l.Click += Method1;
if (rnd.Next(3) == 0) l.Click += Method2;
if (rnd.Next(3) == 0) l.Click += Method3;
_flowLP.Controls.Add(l);
}
Về chỉnh sửa: Nếu không thể xác định phương thức được thêm vào danh sách yêu cầu của sự kiện, bạn có thể giữ các đại biểu đã được thêm vào trình xử lý sự kiện trong bộ sưu tập ở đâu đó và sử dụng nó để xóa đại biểu khi thời gian đến. Hoặc, nếu bạn biết bạn đang xóa hoàn toàn danh sách yêu cầu của sự kiện, chỉ cần xóa chúng hoàn toàn. – phoog