私は Windows サービス プロジェクトのコーディングを行っています。System.Timers.Timer をいくつかの作業に使用しています。
間隔を 2000 ミリ秒に設定しました。
しかし、タイマーは最初の 2000 ミリ秒で Elapsed イベントを 1 回発生させ、その後 2000 ミリ秒ごとに Elapsed イベントを 2 回発生させることがわかりました。
私のプログラムに何か問題があると思います。ロックで解決しようとしています:
var timer_lock = new object();
DateTime last_elapse_time = DateTime.MinValue;
var _tm = new System.Timers.Timer(2000);
_tm.Elapsed += (object sender, System.Timers.ElapsedEventArgs e) =>
{
lock (timer_lock)
{
var cur_time = DateTime.Now;
var interval = (cur_time - last_elapse_time).TotalMilliseconds;
if (interval < 2000)
return;
last_elapse_time = cur_time;
System.Diagnostics.Trace.WriteLine(cur_time.Second);
};
}
_tm.Start();
しかし、私はそれが機能しないことを発見しました.Trace.WriteLineは2回実行され、次に別のテストを試みました:
static void Main()
{
new System.Threading.Thread(new System.Threading.ThreadStart(() => {
while (true)
{
System.Threading.ThreadPool.QueueUserWorkItem((object context) =>
{
var cur_time = DateTime.Now;
System.Diagnostics.Trace.WriteLine(cur_time.Second);
});
System.Threading.Thread.Sleep(2000);
}
})).Start();
}
でも何も変わらない..
問題をテストするために新しいコンソールプロジェクトを作成すると、問題がなくなり、タイマーがうまく機能します。
次に、新しい Windows サービス プロジェクトを作成すると、問題が再び発生します。
OnStart()
の runメソッドでWindows サービス プロジェクトをデバッグしていますMain()
が、これが原因ですか?