เรียกใช้เมธอดทุกๆ 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.FromMinutes(5)
Michael Haren

2
@MichaelHaren ฉันไม่รู้ว่ามันดีมาก ขอบคุณ!
asawyer

4
@asawyer น่าเสียดายที่การใช้งานของคุณเกิดข้อผิดพลาดในการคอมไพล์ กลับสองครั้งในขณะที่การจับเวลาคาดว่าจำนวนเต็มหรือTotalMilliseconds TimeSpanฉันพยายามอัปเดตคำตอบของคุณสำหรับคำตอบที่มีพนักงานTimeSpanและพ่นออกมาโดยไม่จำเป็น อย่างไรก็ตามคุณเปลี่ยนกลับ
André C. Andersen

2
@ AndréChristofferAndersenเปลี่ยน 0 ในตัวสร้างเวลาเป็น TimeSpan.Zero โค้ดใช้งานได้หลังจากนี้
RredCat

2
รหัสให้ข้อผิดพลาด นี่คือการแก้ไข 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()method บนวัตถุจับเวลา ตัวอย่าง: การ timer.Dispose()ใช้รหัสด้านบนเป็นข้อมูลอ้างอิง วิธีนี้จะทำลายตัวจับเวลาและป้องกันไม่ให้คุณใช้อีก timer.Change(Timeout.Infinite, Timeout.Infinite)จะดีกว่าถ้าคุณต้องการใช้ตัวจับเวลาอีกครั้งในโปรแกรมเดียวกัน
Joel Trauger

1
แต่ทำไม MyMethod () ไม่ทำงานเมื่อฉันเรียกใช้ในแอปพลิเคชันคอนโซล
Izuagbala

@Izuagbala เป็นเรื่องยากที่จะบอกว่าทำไมมันถึงไม่ได้ผลสำหรับคุณโดยไม่ทราบรายละเอียดว่าคุณตั้งค่าอย่างไร โซลูชันนี้ได้รับการทดสอบในแอปพลิเคชันคอนโซล
André C. Andersen

โมฆะคืออะไร?
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.