0

コードの一部を実行するWindowsサービスを作成し、タイマーを実装して定期的に実行します。

私のタイマークラスは:

class TimerClass
{
    private static System.Timers.Timer aTimer;

    public static void Main()
    {

        aTimer = new System.Timers.Timer(1000);

        aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);

        aTimer.Interval = 5000;
        aTimer.Enabled = true;

        GC.KeepAlive(aTimer);
    }


    private static void OnTimedEvent(object source, ElapsedEventArgs e)
    {
        aTimer.Stop();
        DatabaseUpdation dbUp = new DatabaseUpdation();
        File.AppendAllText(@"C:\Documents and Settings\New Folder\My Documents\demo\abc.txt", "Start" + " " + DateTime.Now.ToString() + Environment.NewLine);
        dbUp.GetDatafromSource();

        aTimer.Start();
    }

}

そして、私はそれを私のStartメソッドから呼び出しています:

    protected override void OnStart(string[] args)
    {
        TimerClass timer = new TimerClass();
    }

しかし、タイマーはまったく実行されていません。誰かが私にここで間違いを見つけることができますか?前もって感謝します

4

4 に答える 4

3

コンストラクタについてお読みください

初期化コードは publicstatic void Main()ではなく、代わりにpublic TimerClass()

class TimerClass
{
    private System.Timers.Timer aTimer;

    public TimerClass()
    {
        aTimer = new System.Timers.Timer(1000);
        aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
        aTimer.Interval = 5000;
        aTimer.Enabled = true;
        GC.KeepAlive(aTimer);
    }

    private void OnTimedEvent(object source, ElapsedEventArgs e)
    {
        aTimer.Stop();
        DatabaseUpdation dbUp = new DatabaseUpdation();
        File.AppendAllText(@"C:\Documents and Settings\New Folder\My Documents\demo\abc.txt", "Start" + " " + DateTime.Now.ToString() + Environment.NewLine);
        dbUp.GetDatafromSource();
        aTimer.Start();
    }
}

また、メソッドと aTimer は静的であってはなりません。

于 2013-01-24T09:12:39.943 に答える
2

Mainタイマーを開始するには、メソッドを呼び出す必要があります。

protected override void OnStart(string[] args)
{
    TimerClass.Main();
}

ところで、あまり良い名前ではありません-次のようなものStartが良いと思います。また、これがアプリのエントリ ポイント メソッドではないことを願っています。

于 2013-01-24T09:15:03.760 に答える
1

これを試して:

class TimerClass
    {
        private static System.Timers.Timer aTimer;

        public static void Main()
        {

            aTimer = new System.Timers.Timer(1000);

            aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);

            aTimer.Interval = 5000;


            GC.KeepAlive(aTimer);

        }
        public static void Start()
        {
           aTimer.Start();


        }



        private static void OnTimedEvent(object source, ElapsedEventArgs e)
        {
            aTimer.Stop();
            DatabaseUpdation dbUp = new DatabaseUpdation();
            File.AppendAllText(@"C:\Documents and Settings\New Folder\My Documents\demo\abc.txt", "Start" + " " + DateTime.Now.ToString() + Environment.NewLine);
            dbUp.GetDatafromSource();

            aTimer.Start();
        }

    }

次のように呼び出す必要があります。

protected override void OnStart(string[] args)
    {
        //TimerClass timer = new TimerClass();<==No need it's static class!!!
        TimerClass.Main();
        TimerClass.Start();
    }
于 2013-01-24T09:22:22.980 に答える
1

タイマーを開始するのを忘れました。あなたの経過の外にそれを移動します。Elapse は、タイマーが期限切れになったときにのみ呼び出されます。

aTimer.Start(); 

参考までに、開始メソッドを呼び出したら、タイマーを有効にする必要はありません

于 2013-01-24T09:11:40.857 に答える