【发布时间】:2012-02-04 15:46:04
【问题描述】:
在不调用 Dispose() 或 Close() 的情况下放弃 .NET 中的计时器是否安全?
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:实际上写入文件正是我们要做的。这是想法。我想扩展一个日志框架以允许使用计时器和队列进行异步日志记录。但是我不希望日志记录网络的用户不得不费心处理,因为其他记录器类型都不需要这个。
标签: c# .net multithreading timer