我正在开发一个客户端-服务器应用程序。我有一个无限的while循环来检查客户端(或服务器)是否发送了数据。
while (true)
{
// do things
}但是,这方面的最佳实践是什么呢?使用上面的代码,当服务器接受客户端时,系统的CPU会跳到100%。
如果我把Threading.Thread.Sleep(500)放在循环的末尾,CPU的使用率会更好,但我不知道这是不是最好的方法,或者它是否应该有所不同。
(我知道我能够异步获取数据--但我的问题不是这个,而是关于while循环的最佳实践,这样应用程序就不会完全消耗CPU)
发布于 2015-05-18 04:50:32
我想知道这是不是最好的方法
不是的。
没有转义机制(break,yield return)的无限循环(几乎)从来都不是一个好主意。
或它应该是不同的
是。
您正在执行“忙碌等待”循环,等待客户端发送数据。因此,您的循环应该是I/O限制的,而不是通过重复轮询来限制CPU的。这在评论中已经提到过好几次了。
但为了便于讨论,让我们假设
那么,任何解决方案至少需要注意两个部分:
停止条件
这样做的一种方法是使用连接到CancellationTokenSource的CancellationToken来允许干净的停止方式。
while (!cancelToken.IsCancellationRequested)
{
// Do stuff
// Note: this still does not solve the issue of eating CPU resources.
// If you were not polling periodically but waiting for a condition,
// you could now do:
try
{
var someResult = await MyCancelableAsyncOperation(..., cancelToken);
// do stuff with this result.
}
catch (OperationCanceledException)
{
break; // done
}
}定期轮询
如果你需要定期做事情,可以使用可取消的计时器。请看这里的示例:https://stackoverflow.com/a/30225642/2573395
请注意,此示例说明了基本思想。可以将其修改为:
如果需要,
System.Timers.Timer发布于 2015-05-18 04:53:50
你听说过BackgroundWorker组件吗?这对你的情况会很有用。
https://stackoverflow.com/questions/30291369
复制相似问题