2011-02-24 40 views
8

xem xét cặp này các chức năng trong C#:Bộ hẹn giờ này có được giải phóng khỏi bộ nhớ không?

void func1() { 
    DispatcherTimer tmr = new DispatcherTimer(); 
    tmr.Interval = TimeSpan.FromSeconds(5); 
    tmr.Tick += func2; 
    tmr.Start(); 
} 

void func2(object a, EventArgs b) { 
    // Called every 5 seconds once func1() is called 
} 

Sau khi gọi Func1() một lần, Func2() được gọi mỗi 5 giây từ đó trở đi, mặc dù tôi đã làm mất tài liệu tham khảo để đếm thời gian của tôi kể từ khi phạm vi của nó bị hạn chế tới func1(). Điều đó có nghĩa rằng bộ đếm thời gian rõ ràng là vẫn còn trong bộ nhớ, làm điều của nó, lâu sau khi func1() được gọi. Câu hỏi của tôi là, nếu tôi thêm điều này vào func2():

void func2(object a, EventArgs b) { 
    // Called every 5 seconds once func1() is called 

    ((DispatcherTimer)a).Stop() 
} 

Bộ hẹn giờ có thể được thu thập ngay sau khi chương trình thoát hay không? Nếu nó vẫn còn trong bộ nhớ, làm thế nào tôi có thể đánh dấu nó cho bộ sưu tập bằng tay (hoặc làm một cái gì đó tương tự)?

Câu hỏi phụ mà tôi có (nếu bạn cảm thấy có xu hướng trả lời) là nếu Bộ hẹn giờ thông thường có hành vi giống hệt nhau trong trường hợp này hoặc nếu có sự khác biệt đáng kể tôi nên biết.

Cảm ơn!

Trả lời

7

Lớp Threading.Dispatcher giữ một danh sách tất cả các DispatcherTimers đang hoạt động. Khi bạn gọi Stop() trong trình xử lý sự kiện Tick thì bộ hẹn giờ sẽ bị xóa khỏi danh sách đó. Hiện tại không còn bất kỳ tham chiếu nào đến bộ hẹn giờ. Nó cuối cùng sẽ được thu gom rác. Đó là okay vì không có cách nào để có được bộ đếm thời gian bắt đầu một lần nữa. Sau khi tất cả, bạn không có bất kỳ cách nào để lấy tham chiếu nữa, trình xử lý sự kiện Tick là ảnh cuối cùng của bạn.

0

Theo this, bạn sẽ phải gọi dừng và xóa trình xử lý.

0

Về cơ bản một DispatcherTimer sinh ra một Thread.So mới phạm vi của nó không thể được định nghĩa như bình thường chúng ta sẽ nghĩ. Bạn có thể thay thế giết chủ đề bằng các phương pháp cụ thể.

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