কেবল এটি - আপনি কীভাবে একটি সি # কনসোল অ্যাপ্লিকেশনটিতে টাইমার যুক্ত করবেন? আপনি যদি কিছু উদাহরণ কোডিং সরবরাহ করতে পারেন তবে দুর্দান্ত হবে।
কেবল এটি - আপনি কীভাবে একটি সি # কনসোল অ্যাপ্লিকেশনটিতে টাইমার যুক্ত করবেন? আপনি যদি কিছু উদাহরণ কোডিং সরবরাহ করতে পারেন তবে দুর্দান্ত হবে।
উত্তর:
এটি খুব সুন্দর, তবে কিছুটা সময় অনুকরণের জন্য আমাদের একটি কমান্ড চালানো দরকার যা কিছুটা সময় নেয় এবং এটি দ্বিতীয় উদাহরণে খুব স্পষ্ট।
যাইহোক, কিছু কার্যকারিতা চিরকালের জন্য লুপের জন্য ব্যবহারের স্টাইলটিতে প্রচুর ডিভাইস সংস্থান লাগে এবং এর পরিবর্তে আমরা আবর্জনা সংগ্রাহককে এর মতো কিছু করতে ব্যবহার করতে পারি।
আমরা সিডিআর এর মাধ্যমে সি # তৃতীয় এডের একই বই থেকে কোডটিতে এই পরিবর্তনটি দেখতে পাচ্ছি।
using System;
using System.Threading;
public static class Program {
public static void Main() {
// Create a Timer object that knows to call our TimerCallback
// method once every 2000 milliseconds.
Timer t = new Timer(TimerCallback, null, 0, 2000);
// Wait for the user to hit <Enter>
Console.ReadLine();
}
private static void TimerCallback(Object o) {
// Display the date/time when this method got called.
Console.WriteLine("In TimerCallback: " + DateTime.Now);
// Force a garbage collection to occur for this demo.
GC.Collect();
}
}
GC.Collect()
। সংগ্রহ করার মতো কিছুই নেই। এটি অর্থবহ হয়ে উঠবে, যদি GC.KeepAlive(t)
পরে বলা হয়Console.ReadLine();
System.Treadread.Timer ক্লাস ব্যবহার করুন।
System.Windows. Forms.Timer সাধারণত একক থ্রেডে সাধারণত উইন্ডোজ ফর্ম UI থ্রেড ব্যবহারের জন্য ডিজাইন করা হয়।
.NET কাঠামোর বিকাশে প্রথম দিকে একটি সিস্টেম.টাইমার ক্লাস যুক্ত করা হয়েছে। তবে এটি সাধারণত System.Threading.Timer ক্লাস ব্যবহার করার পরামর্শ দেওয়া হয় কারণ এটি সিস্টেমের চারপাশে কেবল একটি মোড়ক। থ্রেডিং। টাইমার যাইহোক।
আপনি যদি একটি উইন্ডোজ পরিষেবা বিকাশ করে থাকেন এবং পর্যায়ক্রমে চালনার জন্য টাইমার প্রয়োজন হয় তবে সর্বদা একটি স্থিতিশীল (ভিবি.এনইটি তে ভাগ করা হয়েছে) সিস্টেম ব্যবহার করার পরামর্শ দেওয়া হয়। এটি সম্ভবত আপনার টাইমার অবজেক্টের অকাল বর্জ্য সংগ্রহ এড়াবে।
কনসোল অ্যাপ্লিকেশনটিতে টাইমারটির উদাহরণ এখানে:
using System;
using System.Threading;
public static class Program
{
public static void Main()
{
Console.WriteLine("Main thread: starting a timer");
Timer t = new Timer(ComputeBoundOp, 5, 0, 2000);
Console.WriteLine("Main thread: Doing other work here...");
Thread.Sleep(10000); // Simulating other work (10 seconds)
t.Dispose(); // Cancel the timer now
}
// This method's signature must match the TimerCallback delegate
private static void ComputeBoundOp(Object state)
{
// This method is executed by a thread pool thread
Console.WriteLine("In ComputeBoundOp: state={0}", state);
Thread.Sleep(1000); // Simulates other work (1 second)
// When this method returns, the thread goes back
// to the pool and waits for another task
}
}
জেফ রিখর র সিএলআর ভায়া সি # বইটি থেকে । এই বইটি 23 তম অনুচ্ছেদে 3 ধরণের টাইমারগুলির পিছনে যৌক্তিকতা বর্ণনা করে highly
একটি সাধারণ একটি দ্বিতীয় টাইমার টিক তৈরি করতে কোডটি এখানে:
using System;
using System.Threading;
class TimerExample
{
static public void Tick(Object stateInfo)
{
Console.WriteLine("Tick: {0}", DateTime.Now.ToString("h:mm:ss"));
}
static void Main()
{
TimerCallback callback = new TimerCallback(Tick);
Console.WriteLine("Creating timer: {0}\n",
DateTime.Now.ToString("h:mm:ss"));
// create a one second timer tick
Timer stateTimer = new Timer(callback, null, 0, 1000);
// loop here forever
for (; ; )
{
// add a sleep for 100 mSec to reduce CPU usage
Thread.Sleep(100);
}
}
}
এবং এখানে ফলাফল ফলাফল:
c:\temp>timer.exe
Creating timer: 5:22:40
Tick: 5:22:40
Tick: 5:22:41
Tick: 5:22:42
Tick: 5:22:43
Tick: 5:22:44
Tick: 5:22:45
Tick: 5:22:46
Tick: 5:22:47
সম্পাদনা করুন: হার্ড স্পিন লুপগুলি কোডে যুক্ত করা কখনই ভাল ধারণা নয় কারণ তারা কোনও লাভের জন্য সিপিইউ চক্র গ্রহণ করে। এই ক্ষেত্রে থ্রেডের ক্রিয়াগুলি পর্যবেক্ষণ করার অনুমতি দিয়ে অ্যাপ্লিকেশনটি বন্ধ হওয়া থেকে থামানোর জন্য লুপটি যুক্ত করা হয়েছিল। তবে সঠিকতার স্বার্থে এবং সিপিইউ ব্যবহার হ্রাস করার জন্য সেই লুপটিতে একটি সাধারণ স্লিপ কল যুক্ত করা হয়েছিল।
একটু মজা করি
using System;
using System.Timers;
namespace TimerExample
{
class Program
{
static Timer timer = new Timer(1000);
static int i = 10;
static void Main(string[] args)
{
timer.Elapsed+=timer_Elapsed;
timer.Start(); Console.Read();
}
private static void timer_Elapsed(object sender, ElapsedEventArgs e)
{
i--;
Console.Clear();
Console.WriteLine("=================================================");
Console.WriteLine(" DEFUSE THE BOMB");
Console.WriteLine("");
Console.WriteLine(" Time Remaining: " + i.ToString());
Console.WriteLine("");
Console.WriteLine("=================================================");
if (i == 0)
{
Console.Clear();
Console.WriteLine("");
Console.WriteLine("==============================================");
Console.WriteLine(" B O O O O O M M M M M ! ! ! !");
Console.WriteLine("");
Console.WriteLine(" G A M E O V E R");
Console.WriteLine("==============================================");
timer.Close();
timer.Dispose();
}
GC.Collect();
}
}
}
বা Rx ব্যবহার করে, সংক্ষিপ্ত এবং মিষ্টি:
static void Main()
{
Observable.Interval(TimeSpan.FromSeconds(10)).Subscribe(t => Console.WriteLine("I am called... {0}", t));
for (; ; ) { }
}
আপনি যদি আরও কিছু নিয়ন্ত্রণ চান তবে আপনি সম্ভবত সঠিকতা এবং আরও বেশি কোড / জটিলতা চান তবে আপনি নিজের টাইমিং পদ্ধতিগুলিও ব্যবহার করতে পারেন তবে আমি এখনও একটি টাইমার প্রস্তাব করব। আপনার যদি সত্যিকারের টাইমিং থ্রেডের নিয়ন্ত্রণ থাকতে হয় তবে এটি ব্যবহার করুন:
private void ThreadLoop(object callback)
{
while(true)
{
((Delegate) callback).DynamicInvoke(null);
Thread.Sleep(5000);
}
}
আপনার টাইমিং থ্রেড হবে (যখন রিকিউর হয়ে যায় তখন থামাতে এটি পরিবর্তন করুন, এবং যে কোনও সময় বিরতিতে আপনি চান)।
এবং ব্যবহার করতে / শুরু করতে আপনি করতে পারেন:
Thread t = new Thread(new ParameterizedThreadStart(ThreadLoop));
t.Start((Action)CallBack);
কলব্যাক হ'ল আপনার অকার্যকর প্যারামিটারলেস পদ্ধতি যা আপনি প্রতিটি বিরতিতে কল করতে চান। উদাহরণ স্বরূপ:
private void CallBack()
{
//Do Something.
}
আপনি নিজের তৈরিও করতে পারেন (উপলভ্য বিকল্পগুলি থেকে অসন্তুষ্ট হলে)।
আপনার নিজস্ব Timer
বাস্তবায়ন তৈরি করা বেশ বেসিক স্টাফ।
এটি এমন একটি অ্যাপ্লিকেশনের জন্য একটি উদাহরণ যা আমার কোডবেসের বাকী অংশের মতো একই থ্রেডে COM অবজেক্ট অ্যাক্সেসের প্রয়োজন।
/// <summary>
/// Internal timer for window.setTimeout() and window.setInterval().
/// This is to ensure that async calls always run on the same thread.
/// </summary>
public class Timer : IDisposable {
public void Tick()
{
if (Enabled && Environment.TickCount >= nextTick)
{
Callback.Invoke(this, null);
nextTick = Environment.TickCount + Interval;
}
}
private int nextTick = 0;
public void Start()
{
this.Enabled = true;
Interval = interval;
}
public void Stop()
{
this.Enabled = false;
}
public event EventHandler Callback;
public bool Enabled = false;
private int interval = 1000;
public int Interval
{
get { return interval; }
set { interval = value; nextTick = Environment.TickCount + interval; }
}
public void Dispose()
{
this.Callback = null;
this.Stop();
}
}
আপনি ইভেন্টগুলি নিম্নলিখিত হিসাবে যুক্ত করতে পারেন:
Timer timer = new Timer();
timer.Callback += delegate
{
if (once) { timer.Enabled = false; }
Callback.execute(callbackId, args);
};
timer.Enabled = true;
timer.Interval = ms;
timer.Start();
Window.timers.Add(Environment.TickCount, timer);
টাইমার কাজ করে তা নিশ্চিত করার জন্য আপনাকে নিম্নলিখিত হিসাবে অন্তহীন লুপ তৈরি করতে হবে:
while (true) {
// Create a new list in case a new timer
// is added/removed during a callback.
foreach (Timer timer in new List<Timer>(timers.Values))
{
timer.Tick();
}
}
সেখানে আপনি এটি :)
public static void Main()
{
SetTimer();
Console.WriteLine("\nPress the Enter key to exit the application...\n");
Console.WriteLine("The application started at {0:HH:mm:ss.fff}", DateTime.Now);
Console.ReadLine();
aTimer.Stop();
aTimer.Dispose();
Console.WriteLine("Terminating the application...");
}
private static void SetTimer()
{
// Create a timer with a two second interval.
aTimer = new System.Timers.Timer(2000);
// Hook up the Elapsed event for the timer.
aTimer.Elapsed += OnTimedEvent;
aTimer.AutoReset = true;
aTimer.Enabled = true;
}
private static void OnTimedEvent(Object source, ElapsedEventArgs e)
{
Console.WriteLine("The Elapsed event was raised at {0:HH:mm:ss.fff}",
e.SignalTime);
}
আমি আপনাকে মাইক্রোসফ্টের নির্দেশিকা অনুসরণ করার পরামর্শ দিই ( https://docs.microsoft.com/en-us/dotnet/api/system.timers.timer.interval?view=netcore-3.1 )।
আমি প্রথমে ব্যবহার System.Threading;
করার চেষ্টা করেছি
var myTimer = new Timer((e) =>
{
// Code
}, null, TimeSpan.Zero, TimeSpan.FromSeconds(5));
কিন্তু এটি অবিরত continuously 20 মিনিটের পরে বন্ধ হয়ে যায়।
এটির সাথে, আমি সমাধানগুলির সেটিংটি চেষ্টা করেছি
GC.KeepAlive(myTimer)
অথবা
for (; ; ) { }
}
তবে তারা আমার ক্ষেত্রে কাজ করেনি।
মাইক্রোসফ্ট ডকুমেন্টেশন অনুসরণ করে, এটি নিখুঁতভাবে কাজ করেছে:
using System;
using System.Timers;
public class Example
{
private static Timer aTimer;
public static void Main()
{
// Create a timer and set a two second interval.
aTimer = new System.Timers.Timer();
aTimer.Interval = 2000;
// Hook up the Elapsed event for the timer.
aTimer.Elapsed += OnTimedEvent;
// Have the timer fire repeated events (true is the default)
aTimer.AutoReset = true;
// Start the timer
aTimer.Enabled = true;
Console.WriteLine("Press the Enter key to exit the program at any time... ");
Console.ReadLine();
}
private static void OnTimedEvent(Object source, System.Timers.ElapsedEventArgs e)
{
Console.WriteLine("The Elapsed event was raised at {0}", e.SignalTime);
}
}
// The example displays output like the following:
// Press the Enter key to exit the program at any time...
// The Elapsed event was raised at 5/20/2015 8:48:58 PM
// The Elapsed event was raised at 5/20/2015 8:49:00 PM
// The Elapsed event was raised at 5/20/2015 8:49:02 PM
// The Elapsed event was raised at 5/20/2015 8:49:04 PM
// The Elapsed event was raised at 5/20/2015 8:49:06 PM