Đôi khi người dùng muốn lập lịch một bộ hẹn giờ lớn và không muốn quản lý các tham chiếu đến các bộ hẹn giờ đó.
Trong trường hợp người dùng không tham chiếu bộ hẹn giờ, bộ hẹn giờ có thể được GC thu thập trước khi nó được thực thi.
tôi tạo ra các Timers lớp để phục vụ như một giữ chỗ cho giờ mới được tạo ra:Rò rỉ bộ nhớ xung quanh hẹn giờ ủy nhiệm
static class Timers
{
private static readonly ILog _logger = LogManager.GetLogger(typeof(Timers));
private static readonly ConcurrentDictionary<Object, Timer> _timers = new ConcurrentDictionary<Object, Timer>();
/// <summary>
/// Use this class in case you want someone to hold a reference to the timer.
/// Timer without someone referencing it will be collected by the GC even before execution.
/// </summary>
/// <param name="dueTime"></param>
/// <param name="action"></param>
internal static void ScheduleOnce(TimeSpan dueTime, Action action)
{
if (dueTime <= TimeSpan.Zero)
{
throw new ArgumentOutOfRangeException("dueTime", dueTime, "DueTime can only be greater than zero.");
}
Object obj = new Object();
Timer timer = new Timer(state =>
{
try
{
action();
}
catch (Exception ex)
{
_logger.ErrorFormat("Exception while executing timer. ex: {0}", ex);
}
finally
{
Timer removedTimer;
if (!_timers.TryRemove(obj, out removedTimer))
{
_logger.Error("Failed to remove timer from timers");
}
else
{
removedTimer.Dispose();
}
}
});
if (!_timers.TryAdd(obj, timer))
{
_logger.Error("Failed to add timer to timers");
}
timer.Change(dueTime, TimeSpan.FromMilliseconds(-1));
}
}
Nếu tôi không vứt bỏ bộ đếm thời gian lấy ra, nó kết quả với một rò rỉ bộ nhớ.
Có vẻ như ai đó đang giữ tham chiếu đến đại biểu của người theo dõi sau khi bộ hẹn giờ bị xóa khỏi bộ sưu tập _timers
.
Câu hỏi đặt ra là tại sao tôi bị rò rỉ bộ nhớ nếu tôi không bỏ hẹn giờ?
Có lẽ tôi không hiểu những gì bạn đang yêu cầu, bởi vì nó có vẻ như bạn đang tự hỏi tại sao một cái gì đó đối xử tệ bạc khi bạn ngược đãi nó ... –
Tôi hiểu rằng tài liệu nói rằng các thành phần cần được xử lý. Tôi vẫn tò mò những gì ngăn cản từ GC để thu thập các bộ đếm thời gian và các đại biểu nhất định mà không cần gọi phương pháp vứt bỏ. –