Windows フォーム タイマー ( System.Windows.Forms.Timer
) を使用している場合、タイマー コード (Tick
イベント ) は、UI スレッドがビジー状態のときに実行されることはありませんApplication.DoEvents()
。しかし、何らかのタスクを実行するバックグラウンド ワーカーやその他の種類のスレッドがある場合、他のスレッドが何かを実行中であることを明示的に知る方法はありません。
スレッド同期メカニズムを使用して、タイマー イベントで何かを台無しにしないようにする必要があります。いくつかのガード変数を使用することもできます。アーキテクチャの修正を検討することをお勧めします。
編集:
タイマーでアプリケーションのアイドル状態を確認することはできません。タイマーが通知する前に、操作が開始されて一瞬で終了した場合はどうなりますか?
最善の方法は、グローバルlastOperationTime
変数を用意してDateTime.Now
、アクションが実行されるたびにそれを設定することです。次に、タイマーを使用して からの経過時間を確認しlastOperationTime
ます。
void idleTimer_Tick (object sender, EventArgs e)
{
if ((DateTime.Now - lastOperationTime).TotalMinutes > 50)
{
...
}
}
最も難しい部分は、有用な操作を行うすべてのメソッドにコード行を挿入する方法です! 適切に編成された基本クラスを備えた優れたフレームワークがある場合は、コードを更新する必要がある特定の (有限の) ポイントが存在する可能性がありますlastOperationTime
。