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イベントで実行するコードが、プロセスが終了したときに中止するのが安全かどうかです。多分、話すことは不可能です。 dbaseを更新するか、ファイルに書き込むようなことはしないでください。 –
@ハンス:実際にファイルへの書き込みは、まさに実行されるものです。ここに考えがあります。私はタイマーとキューを使って非同期ロギングを可能にするロギングフレームワークを拡張したかったのです。しかし、私は、ロギングネットワークのユーザが、他のロガータイプのどれもこれを必要としないので、処分に気を使わなければならないことを望んでいませんでした。 – galford13x