Виклик методу кожні х хвилин


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

Відповіді:


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

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

25
Інший спосіб встановлення інтервалу - це передача об'єкта часового простору. Я думаю, що це трохи чистіше:Timespan.FromMinutes(5)
Майкл Харен

2
@MichaelHaren Я цього не знав, це дуже приємно. Дякую!
asawyer

4
@asawyer На жаль, ваша реалізація дає помилку компіляції. TotalMillisecondsповертає подвійне, поки таймер очікує цілі числа або TimeSpan. Я спробував оновити вашу відповідь до тієї, яка працює TimeSpanі викидає зайвий наліт; однак ви це повернули.
Андре К. Андерсен

2
@ AndréChristofferAndersen Зміна 0 у конструкторі часу на TimeSpan.Zero. Код працює після цього.
RredCat

2
Код дає помилку. Це виправлення нового System.Threading.Timer ((e) => {Func ();}, null, TimeSpan.Zero, TimeSpan.FromMinutes (1) .TotalMilliseconds);
Ашех

54

Я ґрунтувався на цьому на відповіді @ asawyer. Він, схоже, не отримує помилки компіляції, але деякі з нас це роблять. Ось версія, яку компілятор C # у Visual Studio 2010 прийме.

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

12
Коментування для нащадків. Він зупиниться, коли ви викликали Dispose()метод на об'єкт таймера. Приклад: timer.Dispose()використання наведеного вище коду в якості посилання. Однак це знищить таймер і не дозволить вам використовувати його знову. timer.Change(Timeout.Infinite, Timeout.Infinite)було б краще, якщо ви хочете знову використовувати таймер у тій же програмі.
Джоель Траугер

1
Але чому MyMethod () не запускається, коли я запускаю його в консольному додатку
Izuagbala

@Izuagbala Важко сказати, чому це не працює для вас, не знаючи деталей того, як ви його налаштували. Це рішення було випробувано в консольній програмі.
Андре К. Андерсен

Що таке нуль?
Даніель Рейханян

@DanielReyhanian Ви можете додати стан об'єкта замість того null, що є аргументом при виклику функції зворотного виклику (тобто першого аргументу).
Андре К. Андерсен

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 Package, який може зробити його таким простим, ви можете отримати його звідси 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', але пакет не містить посилань на збирання або файлів вмісту, сумісних із цією рамкою. Для отримання додаткової інформації зверніться до автора пакета.
Адітя Бокаде

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("..."); 
}


0
while (true)
{
    Thread.Sleep(60 * 5 * 1000);
    Console.WriteLine("*** calling MyMethod *** ");
    MyMethod();
}

10
Таймер краще підходить.
Чак Конвей

1
так, якщо що-небудь використання чекає Task.Delay (60 * 5 * 1000);
CMS
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.