প্রতি 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
— ব্যবহারকারী 703016

উত্তর:


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
@ মিশেল হেরেন আমি এটি জানতাম না, এটি খুব সুন্দর। ধন্যবাদ!
— asawyer

4
@ সাওয়ের দুর্ভাগ্যক্রমে আপনার প্রয়োগটি একটি সংকলন ত্রুটি দেয়। TotalMillisecondsটাইমার সংখ্যার প্রত্যাশা করার সময় বা দ্বিগুণ দেয় TimeSpan। আমি আপনার উত্তরটি এমন একজনের সাথে আপডেট করার চেষ্টা করেছি যা নিয়োগ করে TimeSpanএবং অপ্রয়োজনীয় ব্লাট ফেলে দেয়; যাইহোক, আপনি এটি আবার পরিণত।
— আন্দ্রে সি। অ্যান্ডারসন

2
@ এন্ড্রিচ্রিস্টোফারএন্ডারসন 0 টি টাইমস্প্যান্ট.জিরোতে টাইম কনস্ট্রাক্টরে পরিবর্তন করুন। কোড এর পরে কাজ করে।
— রেডটিক্স

2
কোড একটি ত্রুটি দেয়। এটি হ'ল নতুন সিস্টেম। থ্রেডিং।
— আশেহ

54

আমি @ asawyer এর উত্তর উপর ভিত্তি করে। তিনি একটি সংকলন ত্রুটি পেয়েছেন বলে মনে হয় না, তবে আমাদের মধ্যে কিছু লোক তা করে। এখানে একটি সংস্করণ দেওয়া হয়েছে যা ভিজ্যুয়াল স্টুডিও 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
তবে আমি যখন কনসোল অ্যাপ্লিকেশনটিতে এটি চালাচ্ছি তখন মাইমথোড () কেন চালায় না
— ইজুয়াগবালা

@ ইজুগাবালা আপনি কীভাবে এটি সেট আপ করেছেন তার বিশদগুলি না জেনে এটি কেন আপনার পক্ষে কাজ করে না তা বলা শক্ত। এই সমাধানটি একটি কনসোল অ্যাপ্লিকেশনটিতে পরীক্ষা করা হয়েছিল।
— আন্দ্রে সি। অ্যান্ডারসন


@ ড্যানিয়েলরেহিয়ানিয়ান আপনি এর পরিবর্তে কোনও অবজেক্টের স্টেট যুক্ত করতে পারেন 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

আমি একটি নুগেট প্যাকেজ আপলোড করেছি যা এটিকে এত সহজ করে তুলতে পারে, আপনি এটি এখান থেকে এটি পেতে পারেন অ্যাকশনশেডুলার

এটি .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, 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
হ্যাঁ, যদি কোনও কিছু ব্যবহার করে টাস্কের অপেক্ষায় থাকে eডেলা (60 * 5 * 1000);
— CMS
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.