これで、イベント ハンドラーが作成され、時間の経過とともに繰り返しトリガーされます。以前に起動されたハンドラーがまだ実行されている場合は、何もしないでください。これは簡単です。ブール値の「isRunning」をインスタンス フィールドとして追加するだけで、それが true の場合は何もしません。変数へのアクセスを適切に同期するように注意してください。
private int isRunning = 0;//there is no bool overload for `Interlocked.Exchange`
private void button1_Click(object sender, EventArgs e)
{
if (Interlocked.Exchange(ref isRunning, 1) == 0)
{
//do stuff
isRunning = 0;
}
else
{
//another handler is already in progress;
//possibly display message to user, or do nothing, or whatever
}
}
後続のイベント ハンドラーをスキップしたくないが、代わりに待機させて、一度に 1 つのみがクエリを実行するようにしたい場合は、次のように使用できますlock
。
private object key = new object();
private void button1_Click(object sender, EventArgs e)
{
lock (key)
{
//do stuff
}
}