50 मिलीसेकेंड सोने के लिए मुझे मेरा C # प्रोग्राम कैसे मिलेगा?
यह एक आसान सवाल लग सकता है, लेकिन मैं एक अस्थायी मस्तिष्क विफलता पल रहा हूँ!
50 मिलीसेकेंड सोने के लिए मुझे मेरा C # प्रोग्राम कैसे मिलेगा?
यह एक आसान सवाल लग सकता है, लेकिन मैं एक अस्थायी मस्तिष्क विफलता पल रहा हूँ!
जवाबों:
System.Threading.Thread.Sleep(50);
हालाँकि याद रखें, कि मुख्य GUI थ्रेड में ऐसा करने से आपका GUI अपडेट होने से अवरुद्ध हो जाएगा (यह "सुस्त" महसूस होगा)
बस ;
VB.net के लिए भी काम करने के लिए इसे हटा दें ।
किसी भी प्रोग्रामिंग भाषा में प्रतीक्षा करने के लिए मूल रूप से 3 विकल्प हैं:
1. के लिए - C # में ढीली प्रतीक्षा करें:
Thread.Sleep(numberOfMilliseconds);
हालाँकि, विंडोज़ थ्रेड शेड्यूलर की अशुद्धि का कारण Sleep()
लगभग 15ms है (इसलिए नींद आसानी से 20ms तक प्रतीक्षा कर सकती है, भले ही वह केवल 1ms के लिए प्रतीक्षा करने के लिए निर्धारित हो)।
2 के लिए - C # में टाइट वेटिंग है:
Stopwatch stopwatch = Stopwatch.StartNew();
while (true)
{
//some other processing to do possible
if (stopwatch.ElapsedMilliseconds >= millisecondsToWait)
{
break;
}
}
हम DateTime.Now
समय मापन के अन्य साधनों का भी उपयोग कर सकते हैं , लेकिन Stopwatch
यह बहुत तेज़ है (और यह वास्तव में तंग लूप में दिखाई देगा)।
3. के लिए - संयोजन:
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
}
यह कोड नियमित रूप से 1ms (या थोड़ा और अधिक, ओएस थ्रेड शेड्यूलिंग पर निर्भर करता है) के लिए धागे को अवरुद्ध करता है, इसलिए प्रोसेसर अवरुद्ध होने के उस समय के लिए व्यस्त नहीं है और कोड प्रोसेसर की 100% शक्ति का उपभोग नहीं करता है। अन्य प्रसंस्करण अभी भी बीच में अवरुद्ध किया जा सकता है (जैसे: यूआई का अद्यतन करना, घटनाओं से निपटना या बातचीत / संचार सामग्री करना)।
आप विंडोज में सोने का सही समय नहीं बता सकते । इसके लिए आपको एक वास्तविक समय ओएस की आवश्यकता है। आप जो सबसे अच्छा कर सकते हैं, वह न्यूनतम नींद का समय है। इसके बाद शेड्यूलर पर निर्भर है कि आप उसके बाद अपने धागे को जगाएं। और कभी भी.Sleep()
GUI थ्रेड पर कॉल न करें ।
चूंकि अब आपके पास async / प्रतीक्षा सुविधा है, 50ms के लिए सोने का सबसे अच्छा तरीका टास्क है।
async void foo()
{
// something
await Task.Delay(50);
}
या यदि आप .NET 4 को लक्षित कर रहे हैं (VS2010 या Microsoft.Bcl.Async के लिए Async CTP 3 के साथ), तो आपको यह करना होगा:
async void foo()
{
// something
await TaskEx.Delay(50);
}
इस तरह से आप UI थ्रेड को ब्लॉक नहीं करेंगे।
FlushAsync
संस्करण है।
async
लिए घोषणा की आवश्यकता नहीं होती हैTask.Delay(50).Wait();
इस कोड का उपयोग करें
using System.Threading;
// ...
Thread.Sleep(50);
Thread.Sleep(50);
निर्दिष्ट समय की मात्रा के लिए ऑपरेटिंग सिस्टम द्वारा निष्पादन के लिए धागा निर्धारित नहीं किया जाएगा। यह विधि WaitSleepJoin को शामिल करने के लिए थ्रेड की स्थिति को बदलता है।
यह विधि मानक COM और SendMessage पंपिंग नहीं करती है। यदि आपको थ्रेड पर सोने की आवश्यकता है जिसमें STAThreadAttribute है, लेकिन आप मानक COM और SendMessage पम्पिंग करना चाहते हैं, तो टाइमआउट अंतराल निर्दिष्ट करने वाली जॉइन विधि के अधिभार में से एक का उपयोग करने पर विचार करें।
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);
}