0

私は 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()が、これが原因ですか?

4

2 に答える 2

0

var _tm = new System.Timers.Timer(2000);onstart メソッドの外側で設定するだけです...たとえば、コンストラクターで。これで問題が解決するはずです

于 2013-02-22T11:01:20.670 に答える
0

最後に、ロックとチェック間隔を使用して解決しました。

于 2013-02-23T10:01:21.663 に答える