首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用无限while循环处理客户端/服务器数据的最佳实践

使用无限while循环处理客户端/服务器数据的最佳实践
EN

Stack Overflow用户
提问于 2015-05-18 03:42:12
回答 2查看 1.7K关注 0票数 2

我正在开发一个客户端-服务器应用程序。我有一个无限的while循环来检查客户端(或服务器)是否发送了数据。

代码语言:javascript
运行
复制
while (true)
{
    // do things
}

但是,这方面的最佳实践是什么呢?使用上面的代码,当服务器接受客户端时,系统的CPU会跳到100%。

如果我把Threading.Thread.Sleep(500)放在循环的末尾,CPU的使用率会更好,但我不知道这是不是最好的方法,或者它是否应该有所不同。

(我知道我能够异步获取数据--但我的问题不是这个,而是关于while循环的最佳实践,这样应用程序就不会完全消耗CPU)

EN

回答 2

Stack Overflow用户

发布于 2015-05-18 04:50:32

我想知道这是不是最好的方法

不是的。

没有转义机制(breakyield return)的无限循环(几乎)从来都不是一个好主意。

或它应该是不同的

是。

您正在执行“忙碌等待”循环,等待客户端发送数据。因此,您的循环应该是I/O限制的,而不是通过重复轮询来限制CPU的。这在评论中已经提到过好几次了。

但为了便于讨论,让我们假设

  • 你的代码实际上是受CPU限制的,
  • 你需要轮询某些条件才能做某事,
  • 你不能使用标准的同步或信令原语(如阻塞队列、事件、信号量等)来“等待”或“等待”那个条件。

那么,任何解决方案至少需要注意两个部分:

  1. 循环的停止条件。
  2. 仅消耗CPU并在实际需要时占用线程。

停止条件

这样做的一种方法是使用连接到CancellationTokenSourceCancellationToken来允许干净的停止方式。

代码语言:javascript
运行
复制
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
  • Adjust不同的计时器动态设置计时器间隔。
票数 4
EN

Stack Overflow用户

发布于 2015-05-18 04:53:50

你听说过BackgroundWorker组件吗?这对你的情况会很有用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30291369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档