Являются ли таймеры в .NET безопасными для отказа без вызова Dispose() или Close()?Можно ли безопасно отключить таймер
static System.Timers.Timer timer = new Timer();
void Main()
{
timer.Elapsed += LogTimer_Elapsed(object, System.Timers.ElapsedEventArgs);
timer.Start();
Thread.Sleep(10000); // Simulate doing something on main thread
}
static void LogTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
DoStuff();
}
У кого-нибудь есть проблемы с этим решением?
static QueueLogger()
{
LogQueue = new Queue<KeyValuePair<Logger, LogEntry>>(50);
LogTimer = new Timer();
LogTimer.Elapsed +=new System.Timers.ElapsedEventHandler(LogTimer_Elapsed);
AppDomain.CurrentDomain.ProcessExit += new EventHandler(CurrentDomain_ProcessExit);
}
static void CurrentDomain_ProcessExit(object sender, EventArgs e)
{
LogTimer.Stop();
LogTimer.Dispose();
LogTimer_Elapsed(sender, null); // This is to process any remaining messages in the queue
}
static void LogTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
lock (_locker)
{
while (LogQueue.Count > 0)
{
var queuedLogger = LogQueue.Dequeue();
try
{
if (e != null) queuedLogger.Value.Message += " From " + sender.ToString();
queuedLogger.Key.Log(queuedLogger.Value);
}
catch (Exception ex)
{
OnLoggingError(queuedLogger.Key, "Async Logging error", ex);
}
}
}
}
Таймер не является проблемой. Реальный вопрос: безопасен ли код, который вы запускаете в событии Elapsed, прервать, когда процесс завершается. Может быть, невозможно сказать. Не делайте ничего подобного обновлению базы данных или записи в файл. –
@ Hans: Собственно, написание в файл точно, что бы было сделано. Вот идея. Я хотел расширить структуру ведения журнала, чтобы разрешить асинхронное ведение журнала с использованием таймера и очереди. Но я не хотел, чтобы пользователь сети протоколирования беспокоился об утилизации, поскольку ни один из других типов регистраторов не нуждается в этом. – galford13x