我在C#中有一个控制台服务器,它在一段时间(真实)循环中保持运行。但这需要>即使它什么也不做,50%的CPU。我试过Thread.Sleep它有效!不再吃我的CPU但是,它没有在指定的确切时间内恢复,并且不被认为是良好的做法。我做对了吗?或者除了使用while(true)和Thread.Sleep之外还有其他方法吗?
答案 0 :(得分:0)
我无法评论,所以我会把它放在这里。
理论上Thread.sleep(1)
它不会使用那么多的CPU。
您可以从此问题/答案中获取更多信息:What is the impact of Thread.Sleep(1) in C#?
答案 1 :(得分:0)
您可以使用System.Threading.Timer
课程。它提供了一种机制,用于以指定的时间间隔在线程池线程上执行方法。
示例
public void Start()
{
}
int dueTime = 1000;
int periodTS = 5000;
System.Threading.Timer myTimer = new System.Threading.Timer(new TimerCallback(Start), null, dueTime, periodTS);
这将在调用1秒后调用start方法,并在每5秒后调用该启动方法。
您可以详细了解Timer
课程here。
答案 2 :(得分:0)
如果要暂停线程一段时间而不消耗CPU资源,通常会使用一些WaitHandle(例如AutoResetEvent或ManualResetEvent)并调用它的WaitOne()方法来暂停线程,直到应该唤醒它的事件发生(例如按下键,新的网络连接到达,异步操作完成等)。
要定期唤醒线程,您可以使用计时器。我不知道.NET Framework中有任何计时器,提供WaitHandle(当然你可以自己轻松创建这样的类),所以必须使用Timer并在其中的每个刻度上手动调用AutoResetEvent.Set()回调。
private static AutoResetEvent TimerWaitHandle = new AutoResetEvent(false);
static void Main()
{
// Initialize timer
var timerPeriod = TimeSpan.FromMilliseconds(500);
Timer timer = new Timer(TimerCallback, null, timerPeriod, timerPeriod);
while(true)
{
// Here perform your game logic
// Suspend main thread until next timer's tick
TimerWaitHandle.WaitOne();
// It is sometimes useful to wake up thread by more than event,
// for example when new user connects etc. WaitHandle.WaitAny()
// allows you to wake up thread by any event, whichever occurs first.
//WaitHandle.WaitAny(new[] { TimerWaitHandle, tcpListener.BeginAcceptSocket(...).AsyncWaitHandle });
}
}
static void TimerCallback(Object state)
{
// If possible, you can perform desired game logic here, but if you
// need to handle it on main thread, wake it using TimerWaitHandle.Set()
TimerWaitHandle.Set();
}