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 分ごとに呼び出されるので、ちょっと役に立たないようです。実際に長いタイマー間隔を設定する方法はありますか?