- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
因为我的问题与这个问题很接近,所以我一直在寻找来自这个可能解决方案的反馈:Reading on a NetworkStream = 100% CPU usage但我找不到我需要的解决方案。
就像在另一个问题中一样,我想使用除无限 while 循环之外的其他东西。
更准确地说,我正在使用 Xamarin
在 Visual Studio
中构建 Android
应用程序。因为我需要 Bluetooth
服务,所以我使用 Stream
来读取和发送数据。
从 Stream.InputStrem
读取数据是我遇到的问题:是否有某种等待数据可用的阻塞调用而不使用 while (真)循环?
我试过了:
这是一个代码示例:
public byte[] RetrieveDataFromStream()
{
List<byte> packet = new List<byte>();
int readBytes = 0;
while (_inputStream.CanRead && _inputStream.IsDataAvailable() && readBytes < 1024 && _state == STATE_CONNECTED)
{
try
{
byte[] buffer = new byte[1];
readBytes = _inputStream.Read(buffer, 0, buffer.Length);
packet.Add(buffer[0]);
}
catch (Java.IO.IOException e)
{
return null;
}
}
return packet.ToArray();
}
我从一个 while 循环中调用这个方法。此循环将检查,直到此方法返回 NULL 以外的其他内容,在这种情况下,我将相应地处理数据。
一旦有数据要处理,CPU 使用率就会变低,比没有数据要处理时要低得多。
我知道为什么我的 CPU 使用率很高:循环将尽可能频繁地检查是否有可读取的内容。从好的方面来说,接收数据时几乎没有延迟,但这不是一个可行的解决方案。
有什么想法可以改变吗?
# 更新 1
根据 Marc Gravell 的想法,以下是我想了解并尝试的内容:
byte buffer = new byte[4096];
while (_inputStream.CanRead
&& (readBytes = _inputStream.Read(buffer, 0, buffer.Length)) > 0
&& _state == STATE_CONNECTED)
{
for(int i = 0 ; i < readBytes; i++)
packet.Add(buffer[i]);
// or better: some kind of packet.AddRange(buffer, 0, readBytes)
}
你如何称呼这个代码 fragment ?两个问题:
如果没有可读取的内容,则 while 条件将为解雇:下一步该做什么?
读完之后,接下来要做什么?您如何捕获任何新传入的数据包?
以下是一些应该有所帮助的解释:
最佳答案
立即修复是:
例如:
byte buffer = new byte[4096];
while (_inputStream.CanRead
&& (readBytes = _inputStream.Read(buffer, 0, buffer.Length)) > 0
&& _state == STATE_CONNECTED)
{
for(int i = 0 ; i < readBytes; i++)
packet.Add(buffer[i]);
// or better: some kind of packet.AddRange(buffer, 0, readBytes)
}
请注意,在原始的 while
检查中使用 readBytes
看起来有些……困惑;我将其替换为“当我们没有得到 EOF”检查时;随意添加您自己的逻辑。
关于android - 读取 .NET 流 : high CPU usage - how to read wihtout while (true)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26177327/
因为我的问题与这个问题很接近,所以我一直在寻找来自这个可能解决方案的反馈:Reading on a NetworkStream = 100% CPU usage但我找不到我需要的解决方案。 就像在另一
我是 Promises 的新手,我肯定写了不正确的代码(我还不明白 Promises 是如何工作的)。 从下面的代码中,我预计只有当其他所有事情都完成时才会执行process.exit(0);。 但是
我是一名优秀的程序员,十分优秀!