x分ごとにメソッドを呼び出す


116

5分ごとにメソッドを呼び出したい。これどうやってするの?

public class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("*** calling MyMethod *** ");
        Console.ReadLine();
    }

    private MyMethod()
    {
        Console.WriteLine("*** Method is executed at {0} ***", DateTime.Now);
        Console.ReadLine();
    }
}

10
System.Threading.Timer
user703016 2012年

1
またはSystem.Timers.Timer-dotnetperls.com/timer – sinanakyazici 2012
20:39

回答:


182
var startTimeSpan = TimeSpan.Zero;
var periodTimeSpan = TimeSpan.FromMinutes(5);

var timer = new System.Threading.Timer((e) =>
{
    MyMethod();   
}, null, startTimeSpan, periodTimeSpan);

25
間隔を設定するもう1つの方法は、timespanオブジェクトを渡すことです。少しすっきりしていると思います:Timespan.FromMinutes(5)
Michael Haren

2
@MichaelHaren私はそれを知らなかった、それはとてもいいです。ありがとうございました!
asawyer

4
@asawyer残念ながら、実装ではコンパイルエラーが発生します。TotalMillisecondsタイマーが整数またはを期待している間にdoubleを返しますTimeSpan。私はあなたの答えをTimeSpan不必要な膨張を採用して捨てる答えに更新しようとしました。ただし、元に戻しました。
アンドレ・C.アンデルセン

2
@AndréChristofferAndersenTimeコンストラクターの0をTimeSpan.Zeroに変更します。コードはこの後に機能します。
RredCat

2
コードでエラーが発生する。これは修正された新しいSystem.Threading.Timer((e)=> {Func();}、null、TimeSpan.Zero、TimeSpan.FromMinutes(1).TotalMilliseconds);です。
Asheh 2016年

54

これは@asawyerの回答に基づいています。彼はコンパイルエラーを起こさないようですが、私たちの一部はそうします。これは、Visual Studio 2010のC#コンパイラが受け入れるバージョンです。

var timer = new System.Threading.Timer(
    e => MyMethod(),  
    null, 
    TimeSpan.Zero, 
    TimeSpan.FromMinutes(5));

12
後世へのコメント。Dispose()タイマーオブジェクトのメソッドを呼び出すと停止します。例: timer.Dispose()上記のコードを参照として使用する。ただし、これによりタイマーが破壊され、再び使用することができなくなります。timer.Change(Timeout.Infinite, Timeout.Infinite)同じプログラムで再びタイマーを使用したい場合は、より良いでしょう。
Joel Trauger

1
しかし、なぜコンソールアプリケーションで実行したときにMyMethod()が実行されないのですか
Izuagbala '27

@Izuagbalaどのように設定したかを知らなければ、なぜ機能しないのかはわかりません。このソリューションは、コンソールアプリケーションでテストされました。
アンドレ・C.アンデルセン

ヌルとは何ですか?
ダニエルレイハニアン

@DanielReyhanian nullコールバック関数(つまり、最初の引数)を呼び出すときの引数として、の代わりにオブジェクトの状態を追加できます。
アンドレ・C.アンデルセン

7

クラスのコンストラクターでタイマーを開始します。間隔はミリ秒単位なので、5 * 60秒= 300秒= 300000ミリ秒です。

static void Main(string[] args)
{
    System.Timers.Timer timer = new System.Timers.Timer();
    timer.Interval = 300000;
    timer.Elapsed += timer_Elapsed;
    timer.Start();
}

次にGetData()、次のtimer_Elapsedようなイベントを呼び出します。

static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    //YourCode
}

4

私はそれをとても簡単にすることができるNugetパッケージをアップロードしました、あなたはここからそれを持つことができますActionScheduler

.NET Standard 2.0をサポートしています

そして、ここでそれを使い始める方法

using ActionScheduler;

var jobScheduler = new JobScheduler(TimeSpan.FromMinutes(8), new Action(() => {
  //What you want to execute
}));

jobScheduler.Start(); // To Start up the Scheduler

jobScheduler.Stop(); // To Stop Scheduler from Running.

パッケージ 'CrystalJobScheduler 1.0.0'をインストールできませんでした。'.NETFramework、Version = v4.5'をターゲットとするプロジェクトにこのパッケージをインストールしようとしていますが、パッケージには、そのフレームワークと互換性のあるアセンブリ参照またはコンテンツファイルが含まれていません。詳細については、パッケージの作成者にお問い合わせください。
Aditya Bokade

4

の使用例Timer

using System;
using System.Timers;

static void Main(string[] args)
{
    Timer t = new Timer(TimeSpan.FromMinutes(5).TotalMilliseconds); // Set the time (5 mins in this case)
    t.AutoReset = true;
    t.Elapsed += new System.Timers.ElapsedEventHandler(your_method);
    t.Start();
}

// This method is called every 5 mins
private static void your_method(object sender, ElapsedEventArgs e)
{
    Console.WriteLine("..."); 
}


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.