Isa*_*avo 316
System.Threading.Thread.Sleep(50);
Run Code Online (Sandbox Code Playgroud)
但请记住,在主GUI线程中执行此操作会阻止GUI更新(它会感觉"迟钝")
只需删除它;
以使其适用于VB.net.
Mar*_*oth 147
等待(几乎)任何编程语言基本上有3种选择:
为1. - 在C#中等待:
Thread.Sleep(numberOfMilliseconds);
Run Code Online (Sandbox Code Playgroud)
但是,Windows线程调度程序会导致准确度Sleep()
大约为15ms(因此,即使计划等待1ms,Sleep也可以轻松等待20ms).
for - 在C#中等待是:
Stopwatch stopwatch = Stopwatch.StartNew();
while (true)
{
//some other processing to do possible
if (stopwatch.ElapsedMilliseconds >= millisecondsToWait)
{
break;
}
}
Run Code Online (Sandbox Code Playgroud)
我们也可以使用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
}
Run Code Online (Sandbox Code Playgroud)
此代码会定期阻塞线程1ms(或稍微多一点,具体取决于操作系统线程调度),因此处理器在此时不会占用阻塞,并且代码不会占用处理器100%的功率.其他处理仍然可以在阻塞之间执行(例如:更新UI,处理事件或进行交互/通信事务).
Joe*_*orn 54
您无法在Windows中指定确切的睡眠时间.你需要一个实时操作系统.您可以做的最好的事情是指定最短的睡眠时间.然后由调度程序在此之后唤醒您的线程.而从未叫.Sleep()
GUI线程上.
Ton*_*ina 44
从现在开始你有async/await功能,睡眠50ms的最佳方法是使用Task.Delay:
async void foo()
{
// something
await Task.Delay(50);
}
Run Code Online (Sandbox Code Playgroud)
或者,如果您的目标是.NET 4(使用Async CTP 3 for VS2010或Microsoft.Bcl.Async),则必须使用:
async void foo()
{
// something
await TaskEx.Delay(50);
}
Run Code Online (Sandbox Code Playgroud)
这样您就不会阻止UI线程.
Ale*_*yev 31
使用此代码
using System.Threading;
// ...
Thread.Sleep(50);
Run Code Online (Sandbox Code Playgroud)
Sel*_*irK 14
Thread.Sleep(50);
Run Code Online (Sandbox Code Playgroud)
在指定的时间内,操作系统不会安排该线程执行.此方法更改线程的状态以包括WaitSleepJoin.
此方法不执行标准COM和SendMessage抽取.如果您需要在具有STAThreadAttribute的线程上休眠,但是您想要执行标准COM和SendMessage抽取,请考虑使用指定超时间隔的Join方法的一个重载.
Thread.Join
Run Code Online (Sandbox Code Playgroud)
为了可读性:
using System.Threading;
Thread.Sleep(TimeSpan.FromMilliseconds(50));
Run Code Online (Sandbox Code Playgroud)