web-dev-qa-db-ja.com

非同期で実行するバックグラウンドタイマーの作成

私はこれに本当に苦労しています。 Visual Studioでwinformsアプリケーションを作成していますが、30分ごとに1回作動するバックグラウンドタイマーが必要です。これの目的は、サーバーから更新をプルダウンすることです。

いくつかの異なるアプローチを試しましたが、それらは、チュートリアル/例が貧弱であるか、C#の私自身の欠点のために失敗しました。私が試したことはかなり大したことではないように思えるので、今まで試したことを示すのは時間の無駄だと思います。

C#初心者が簡単に理解できる非同期バックグラウンドタイマーを実装する明確でシンプルな方法を知っている人はいますか?

22
Mike Baxter
_    // Create a 30 min timer 
    timer = new System.Timers.Timer(1800000);

    // Hook up the Elapsed event for the timer.
    timer.Elapsed += OnTimedEvent;

    timer.Enabled = true;


...

private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
    // do stuff
}
_

通常の注意事項:タイマーはそれほど正確ではなく、GC.KeepAlive(timer)が必要になる場合があります

参照: System.Timers.TimerがGCを生き残り、System.Threading.Timerは生き残らないのはなぜですか?

33
Mitch Wheat

フォームでメンバー変数を宣言します。

System.Timers.Timer theTimer;

フォームのロード時(または、ポーリングの更新を開始する必要がある他の時間)に、以下を実行します。

theTimer = new System.Timers.Timer(1800000);
theTimer.Elapsed += PollUpdates;
theTimer.Start();

次のようにPollUpdatesメンバー関数を宣言します。

private void PollUpdates(object sender, EventArgs e)
{
}
10
the_virt

すべてのタイマークラスについて知る必要があると思います。以下のJonの回答を参照してください。

どのようなタイマーを使用していますか?

  1. System.Windows.Forms.TimerはUIスレッドで実行されます
  2. System.Timers.Timerは、SynchronizingObjectを指定しない限り、スレッドプールスレッドで実行されます。
  3. System.Threading.Timerは、スレッドプールスレッドでコールバックを実行します

すべての場合において、タイマー自体は非同期になります-起動するまでスレッドを「占有」しません。

ソース: 。NETタイマーは非同期で実行されますか?

7
JSJ