-1

30 分または 60 分ごとに 1 回データベースをチェックし、結果があればそれを Windows フォーム インターフェイスに表示するプログラムを作成しています。もちろん、from がアクセスを提供する他の機能は、データベース チェックの実行中も使用できるはずです。この目的のために、UI スレッドとは別のスレッドでメソッドを実行する System.Timers.Timer を使用しています (このアプローチの使用に何か問題がある場合は、お気軽にコメントしてください)。ホットなものの動作をテストするために、小さくて単純なプログラムを作成しましたが、実際には間隔を 1 分以上に設定できないことに気付きました (30 分から 1 時間必要です)。私はこの解決策を思いつきました:

public partial class Form1 : Form
{

    int s = 2;

    int counter = 1; //minutes counter

    System.Timers.Timer t;

    public Form1()
    {
        InitializeComponent();

        t = new System.Timers.Timer();
        t.Elapsed += timerElapsed;
        t.Interval = 60000;
        t.Start();
        listBox1.Items.Add(DateTime.Now.ToString());
    }


    //doing stuff on a worker thread
    public void timerElapsed(object sender, EventArgs e)
    {
        //check of 30 minutes have passed
        if (counter < 30)
        {
            //increment counter and leave method
            counter++;
            return;
        }
        else
        {
            //do the stuff
            s++;
            string result = s + "   " + DateTime.Now.ToString() + Thread.CurrentThread.ManagedThreadId.ToString();
            //pass the result to the form`s listbox
            Action action = () => listBox2.Items.Add(result);
            this.Invoke(action);
            //reset minutes counter
            counter = 0;
        }


    }

    //do other stuff to check if threadid`s are different
    //and if the threads work simultaneously
    private void button1_Click(object sender, EventArgs e)
    {
        for (int v = 0; v <= 100; v++)
        {

            string name = v + " " + Thread.CurrentThread.ManagedThreadId.ToString() +
                " " + DateTime.Now.ToString(); ;
            listBox1.Items.Add(name);
            Thread.Sleep(1000); //so the whole operation should take around 100 seconds
        }

    }
}

しかし、この方法では、Elapsed イベントが発生し、timerElapsed メソッドが 1 分ごとに呼び出されるので、ちょっと役に立たないようです。実際に長いタイマー間隔を設定する方法はありますか?

4

1 に答える 1

5

間隔はミリ秒単位であるため、間隔を 60 秒に設定したようです。

t.Interval = 60000; // 60 * 1000 (1 minute)

1 時間の間隔が必要な場合は、間隔を次のように変更する必要があります。

t.Interval = 3600000; // 60 * 60 * 1000 (1 hour)
于 2012-06-09T12:02:41.803 に答える