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-10-22

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)
Michael Haren

2
@MichaelHaren 나는 그것을 몰랐다, 그것은 매우 좋다. 감사합니다!
asawyer

4
@asawyer 불행히도 귀하의 구현은 컴파일 오류를 제공합니다. TotalMilliseconds타이머가 정수 또는를 예상하는 동안 double을 반환합니다 TimeSpan. 나는 TimeSpan불필요한 팽창 을 사용 하고 버리는 것에 대한 당신의 대답을 업데이트하려고했습니다 . 그러나 되돌 렸습니다.
André C. Andersen

2
@ AndréChristofferAndersen Time 생성자의 0을 TimeSpan.Zero로 변경합니다. 이 후에 코드가 작동합니다.
RredCat

2
코드에서 오류가 발생합니다. 이것은 새로운 수정 System.Threading.Timer ((e) => {Func ();}, null, TimeSpan.Zero, TimeSpan.FromMinutes (1) .TotalMilliseconds);
Asheh 2011 년

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

@Izuagbala 설정 방법에 대한 세부 사항을 모르면 왜 작동하지 않는지 말하기는 어렵습니다. 이 솔루션은 콘솔 애플리케이션에서 테스트되었습니다.
André C. Andersen

null은 무엇입니까?
Daniel Reyhanian

@DanielReyhanian null콜백 함수 (즉, 첫 번째 인수)를 호출 할 때 인수로, 대신 객체 상태를 추가 할 수 있습니다 .
André C. Andersen

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.