如何在C#中创建应用程序循环

时间:2017-01-01 18:17:37

标签: c# multithreading loops server

我在C#中有一个控制台服务器,它在一段时间(真实)循环中保持运行。但这需要>即使它什么也不做,50%的CPU。我试过Thread.Sleep它有效!不再吃我的CPU但是,它没有在指定的确切时间内恢复,并且不被认为是良好的做法。我做对了吗?或者除了使用while(true)和Thread.Sleep之外还有其他方法吗?

3 个答案:

答案 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(例如AutoResetEventManualResetEvent)并调用它的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();
}