Вызов метода каждые 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

1
или System.Timers.Timer - dotnetperls.com/timer
— sinanakyazici

Ответы:


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

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

25
Другой способ установить интервал - передать объект timespan. Думаю, это немного чище:Timespan.FromMinutes(5)
— Майкл Харен

2
@MichaelHaren Я этого не знал, это очень мило. Спасибо!
— asawyer

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

2
@ AndréChristofferAndersen Измените 0 в конструкторе Time на TimeSpan.Zero. После этого код работает.
— RredCat

2
Код выдает ошибку. Это исправление new System.Threading.Timer ((e) => {Func ();}, null, TimeSpan.Zero, TimeSpan.FromMinutes (1) .TotalMilliseconds);
— Asheh

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 Трудно сказать, почему это не работает для вас, не зная подробностей того, как вы его настроили. Это решение было протестировано в консольном приложении.
— André C. Andersen

Что такое нуль?
— Даниэль Рейханян

@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, который может сделать его настолько простым, вы можете получить его отсюда 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("..."); 
}


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.