如何使我的C#程序休眠50毫秒?
这似乎是一个简单的问题,但是我正处于暂时性的脑衰竭时刻!
如何使我的C#程序休眠50毫秒?
这似乎是一个简单的问题,但是我正处于暂时性的脑衰竭时刻!
Answers:
System.Threading.Thread.Sleep(50);
但是请记住,在主GUI线程中执行此操作将阻止您的GUI更新(感觉“缓慢”)。
只需删除;
使其也适用于VB.net。
(几乎)任何编程语言都有3种选择等待:
1。-在C#中等待松散:
Thread.Sleep(numberOfMilliseconds);
但是,Windows线程调度程序导致的准确性Sleep()
大约为15ms(因此,即使计划仅等待1ms,Sleep也可以轻松地等待20ms)。
对于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
}
该代码通常将线程阻塞1毫秒(或更长一些,具体取决于OS线程调度),因此在这段阻塞时间内处理器并不忙,并且代码不会消耗100%的处理器功率。在阻塞之间仍然可以执行其他处理(例如:UI更新,事件处理或进行交互/通信工作)。
从现在开始,您就拥有了异步/等待功能,最好的睡眠时间为50ms是使用Task.Delay:
async void foo()
{
// something
await Task.Delay(50);
}
或者,如果您以.NET 4(针对VS2010的Async CTP 3或Microsoft.Bcl.Async)为目标,则必须使用:
async void foo()
{
// something
await TaskEx.Delay(50);
}
这样,您将不会阻止UI线程。
FlushAsync
版本。
async
声明的替代方法是致电Task.Delay(50).Wait();
使用此代码
using System.Threading;
// ...
Thread.Sleep(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);
}