আমি কীভাবে আমার সি # প্রোগ্রামটি 50 মিলিসেকেন্ডে ঘুমাতে পারি?
এটি একটি সহজ প্রশ্ন মনে হতে পারে, তবে আমি একটি অস্থায়ী মস্তিষ্কের ব্যর্থতা মুহূর্ত করছি!
আমি কীভাবে আমার সি # প্রোগ্রামটি 50 মিলিসেকেন্ডে ঘুমাতে পারি?
এটি একটি সহজ প্রশ্ন মনে হতে পারে, তবে আমি একটি অস্থায়ী মস্তিষ্কের ব্যর্থতা মুহূর্ত করছি!
উত্তর:
System.Threading.Thread.Sleep(50);
তবে মনে রাখবেন, মূল জিইউআই থ্রেডে এটি করা আপনার জিইউআইকে আপডেট করা থেকে বিরত রাখবে (এটি "আলস্য" বোধ করবে)
;
এটিও VB.net এর জন্য কাজ করতে কেবল সরান ।
মূলত কোনও প্রোগ্রামিং ভাষায় অপেক্ষা করার জন্য 3 টি পছন্দ রয়েছে:
১ এর জন্য - সি # তে আলগা অপেক্ষা:
Thread.Sleep(numberOfMilliseconds);
যাইহোক, উইন্ডোজ থ্রেড শিডিয়ুলারটি Sleep()
প্রায় 15 মিমি হওয়ার সঠিকতা তৈরি করে (তাই ঘুম কেবল 20 মিমি অপেক্ষা করতে পারে, এমনকি ঠিক 1 মিমি অপেক্ষা করার জন্য নির্ধারিত হলেও)।
২ এর জন্য - সি # তে টাইট ওয়েটিং হ'ল:
Stopwatch stopwatch = Stopwatch.StartNew();
while (true)
{
//some other processing to do possible
if (stopwatch.ElapsedMilliseconds >= millisecondsToWait)
{
break;
}
}
আমরা DateTime.Now
সময় মাপার অন্যান্য উপায়গুলিও ব্যবহার করতে পারি তবে Stopwatch
এটি আরও দ্রুত (এবং এটি সত্যই টাইট লুপে দৃশ্যমান হবে)।
৩. - সংমিশ্রণ:
Stopwatch stopwatch = Stopwatch.StartNew();
while (true)
{
//some other processing to do STILL POSSIBLE
if (stopwatch.ElapsedMilliseconds >= millisecondsToWait)
{
break;
}
Thread.Sleep(1); //so processor can rest for a while
}
এই কোডটি নিয়মিত 1 মিমি জন্য থ্রেড অবরোধ করে (বা ওএস থ্রেড সময়সূচির উপর নির্ভর করে কিছুটা বেশি), তাই প্রসেসর ব্লক করার সময়টির জন্য ব্যস্ত থাকে না এবং কোড প্রসেসরের 100% শক্তি গ্রহণ করে না। অন্যান্য প্রক্রিয়াকরণটি এখনও অবরুদ্ধকরণের মধ্যেই করা যায় (যেমন: ইউআই আপডেট করা, ইভেন্টগুলি পরিচালনা করা বা ইন্টারঅ্যাকশন / যোগাযোগের জিনিসগুলি করা)।
আপনি উইন্ডোজে ঘুমের সঠিক সময় নির্দিষ্ট করতে পারবেন না । তার জন্য আপনার একটি রিয়েল-টাইম ওএস দরকার। আপনি যা করতে পারেন তা সর্বনিম্ন ঘুমের সময় নির্দিষ্ট করে । তারপরে এটির পরে আপনার থ্রেডটি জাগ্রত করা শিডিয়ুলারের হাতে। এবং জিইউআই থ্রেডে কখনও কল করবেন না.Sleep()
।
যেহেতু এখন আপনার কাছে অ্যাসিঙ্ক / অপেক্ষার বৈশিষ্ট্য রয়েছে তাই 50 মিমি পর্যন্ত ঘুমানোর সর্বোত্তম উপায় হ'ল টাস্ক ব্যবহার করে eডেলা:
async void foo()
{
// something
await Task.Delay(50);
}
অথবা আপনি। নেট 4 টি লক্ষ্য করে নিচ্ছেন (ভিএস 2010 বা মাইক্রোসফ্টের জন্য অ্যাসিঙ্ক সিটিপি 3 সহ মাইক্রোসফট.বিসিএল.এসিঙ্ক) আপনার অবশ্যই ব্যবহার করতে হবে:
async void foo()
{
// something
await TaskEx.Delay(50);
}
এইভাবে আপনি ইউআই থ্রেড অবরোধ করবেন না।
FlushAsync
সংস্করণ আছে।
async
ঘোষণার দরকার নেই Task.Delay(50).Wait();
এই কোড ব্যবহার করুন
using System.Threading;
// ...
Thread.Sleep(50);
Thread.Sleep(50);
থ্রেডটি নির্ধারিত সময়ের পরিমাণের জন্য অপারেটিং সিস্টেমের দ্বারা নির্বাহের জন্য নির্ধারিত হবে না। এই পদ্ধতিটি ওয়েটস্লিপজয়নকে অন্তর্ভুক্ত করতে থ্রেডের অবস্থার পরিবর্তন করে।
এই পদ্ধতিটি স্ট্যান্ডার্ড সিওএম এবং সেন্ডম্যাসেজ পাম্পিং করে না। আপনার যদি স্ট্রেডআড্রিট্রিবিউটযুক্ত থ্রেডে ঘুমানোর দরকার হয় তবে আপনি স্ট্যান্ডার্ড সিওএম এবং সেন্ডমেসেজ পাম্পিং করতে চান তবে জয়েন পদ্ধতির একটি ওভারলোড ব্যবহার করে বিবেচনা করুন যা একটি সময়সীমা ব্যবধান নির্দিষ্ট করে।
Thread.Join
পাঠযোগ্যতার জন্য:
using System.Threading;
Thread.Sleep(TimeSpan.FromMilliseconds(50));
দুই ভুবনের সেরা:
using System.Runtime.InteropServices;
[DllImport("winmm.dll", EntryPoint = "timeBeginPeriod", SetLastError = true)]
private static extern uint TimeBeginPeriod(uint uMilliseconds);
[DllImport("winmm.dll", EntryPoint = "timeEndPeriod", SetLastError = true)]
private static extern uint TimeEndPeriod(uint uMilliseconds);
/**
* Extremely accurate sleep is needed here to maintain performance so system resolution time is increased
*/
private void accurateSleep(int milliseconds)
{
//Increase timer resolution from 20 miliseconds to 1 milisecond
TimeBeginPeriod(1);
Stopwatch stopwatch = new Stopwatch();//Makes use of QueryPerformanceCounter WIN32 API
stopwatch.Start();
while (stopwatch.ElapsedMilliseconds < milliseconds)
{
//So we don't burn cpu cycles
if ((milliseconds - stopwatch.ElapsedMilliseconds) > 20)
{
Thread.Sleep(5);
}
else
{
Thread.Sleep(1);
}
}
stopwatch.Stop();
//Set it back to normal.
TimeEndPeriod(1);
}