.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事件中運行的代碼是否可以放棄。也許,不可能說出來。不要做任何事情,比如更新數據庫或寫入文件。 – 2012-02-04 15:55:59
@Hans:實際上寫入文件確切地說會做什麼。這是主意。我想擴展日誌框架以允許使用計時器和隊列進行異步日誌記錄。但是我不希望測井網絡的用戶不必去處理,因爲沒有其他的記錄器類型需要這樣做。 – galford13x 2012-02-04 17:11:16