gpt4 book ai didi

android - 读取 .NET 流 : high CPU usage - how to read wihtout while (true)?

转载 作者:行者123 更新时间:2023-11-30 02:38:12 24 4
gpt4 key购买 nike

因为我的问题与这个问题很接近,所以我一直在寻找来自这个可能解决方案的反馈:Reading on a NetworkStream = 100% CPU usage但我找不到我需要的解决方案。

就像在另一个问题中一样,我想使用除无限 while 循环之外的其他东西。

更准确地说,我正在使用 XamarinVisual Studio 中构建 Android 应用程序。因为我需要 Bluetooth 服务,所以我使用 Stream 来读取和发送数据。

Stream.InputStrem 读取数据是我遇到的问题:是否有某种等待数据可用的阻塞调用而不使用 while (真)循环?

我试过了:

  • 开始/结束阅读
  • Task.Run and await

这是一个代码示例:

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 ?两个问题:

  1. 如果没有可读取的内容,则 while 条件将为解雇:下一步该做什么?

  2. 读完之后,接下来要做什么?您如何捕获任何新传入的数据包?

以下是一些应该有所帮助的解释:

  1. Android 设备通过蓝牙连接到另一个发送数据的设备。它总是会发送一个预先设计好的指定大小(1024)的数据包
  2. 该设备可以连续传输数据一段时间,但也可以随时停止很长一段时间。如何处理此类行为?

最佳答案

立即修复是:

  • 不要一次读取一个字节
  • 不要为每个字节创建一个新缓冲区
  • 不要在没有可用数据时陷入热循环

例如:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com