हर 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 22'12

जवाबों:


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अनावश्यक ब्लोट को रोजगार और फेंकता है; हालाँकि, आपने इसे वापस कर दिया।
आंद्रे सी। एंडरसन 23

2
@ AndréChristofferAndersen टाइम कंस्ट्रक्टर में TimeSpan.Zero में 0 बदलें। इसके बाद कोड काम करता है।
RredCat 14

2
कोड एक त्रुटि देता है। यह ठीक है नया System.Threading.Timer ((e) => {Func ();}; null, TimeSpan.Zero, TimeSpan.FromMinutes (1) .TotalMilliseconds);
आषाढ़

54

मैं @ asawyer के उत्तर पर आधारित हूं। वह एक संकलन त्रुटि नहीं लगती है, लेकिन हम में से कुछ करते हैं। यहाँ एक संस्करण है जिसे विजुअल स्टूडियो 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)बेहतर होगा यदि आप उसी कार्यक्रम में फिर से टाइमर का उपयोग करना चाहते हैं।
जोएल ट्रैगर

1
लेकिन जब मैं इसे कंसोल एप्लीकेशन में चलाता हूं तो MyMethod () क्यों नहीं चलता है
इज़ुआगबाला

@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 पैकेज अपलोड किया है जो इसे इतना सरल बना सकता है, आप इसे यहाँ से कर सकते हैं ActionScheduler

यह .NET स्टैंडर्ड 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, संस्करण = 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
हाँ अगर कुछ भी काम का इंतजार टास्क। डेल (60 * 5 * 1000);
CMS
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.