我在C#中有一個控制檯服務器,它在while(true)循環中保持運行。但即使它沒有做任何事情,CPU佔用> 50%。我嘗試過Thread.Sleep它的工作!不再吃我的CPU,但它不會在指定的確切時間內恢復,並且不被認爲是良好的做法。我做對了嗎?或者,除了使用while(true)和Thread.Sleep之外,還有其他方法嗎?如何在C#中創建應用程序循環#
0
A
回答
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();
}
0
我無法評論,所以我會把它放在這裏。
理論上與Thread.sleep(1)
它不會使用太多的CPU。 您可以從此問題中獲得更多信息:What is the impact of Thread.Sleep(1) in C#?
+0
是的,我不吃CPU,但問題是:有沒有更好的方法來做到這一點,或者這是我不聽任何事件的唯一方法。 – KidCoder
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秒後開始方法,每5秒鐘後調用。
你可以閱讀更多關於Timer
類here。
相關問題
- 1. 如何在C#窗體中創建無限循環窗體應用程序
- 2. 如何在C++中創建for循環
- 3. 在循環中創建程序退出
- 4. 在循環中創建實例凍結應用程序
- 5. 如何在C++中停止應用程序DoEvents循環?
- 6. 如何創建twilio C++應用程序
- 7. 如何在objective-c中創建後臺循環例程?
- 8. 如何在循環中創建循環(雙循環)
- 9. 如何在彙編程序中創建循環?
- 10. 在Jquery中爲構建在Knack上的應用程序創建一個循環
- 11. 如何使用C庫在JavaScript中創建GNOME應用程序
- 12. 如何在C#中使用SQL Server循環創建值
- 13. 如何在C++中使用STL列表創建循環
- 14. 如何處理「循環應用程序」?
- 15. 試圖用while循環創建應用程序
- 16. 在循環中創建C++映射
- 17. 在C++中爲循環創建螺紋
- 18. Objective-c在循環中創建變量
- 19. 如何在C中創建類似Microsoft Office的應用程序#
- 20. 如何在C++ metro應用程序中創建HTTP POST/GET?
- 21. 如何在UWP應用程序中創建COM對象? (C#)
- 22. 如何在uwp C中創建手電筒應用程序#
- 23. 如何在ANSI C中創建窗口應用程序?
- 24. 如何在c#中創建系統事件應用程序?
- 25. 在C++中使用循環創建順序變量名稱
- 26. 如何從C/C++應用程序中創建SQL查詢?
- 27. 如何在VBS中創建循環?
- 28. 如何在perl中創建while循環?
- 29. 如何在循環中創建對象
- 30. 如何在for循環中創建NSArray
什麼是循環在做什麼?通常你會等待某種事件發生,而不是做一個繁忙的循環或者使用'Thread.Sleep()' –
你想讓你的循環執行或暫停的條件是什麼? –
這是服務器的主循環。它將處理所有的遊戲邏輯。它還需要檢查是否有掛起的連接。所以它不聽任何事件。它觸發事件。但是如果這個循環沒有做任何事情或者負載不足,它不僅會加速遊戲的速度(可以處理這個),而且它也會佔用大於50%的CPU,基本上什麼也不做。 – KidCoder