为什么我的C#本机消息传递主机在读取Firefox浏览器扩展程序发送的消息时会挂起?

问题描述 投票:0回答:1

[我在stackoverflow上看到了几个C#本机消息传递主机示例,使用这些代码从Chrome读取消息:

var stdin = Console.OpenStandardInput();
var length = 0;

var lengthBytes = new byte[4];
stdin.Read(lengthBytes, 0, 4);
length = BitConverter.ToInt32(lengthBytes, 0);

var buffer = new char[length];
using (var reader = new StreamReader(stdin))
{
  while (reader.Peek() >= 0)
  {
    reader.Read(buffer, 0, buffer.Length);
  }
}

我使用该代码作为ReadMessage方法的基础,它似乎在Chrome和Firefox中均适用。但是,我现在正在发送更长的消息(大约2K),并且reader.Peek()在第一次通过循环后挂起。

  1. 为什么reader.Peek()挂起?

  2. 为什么从Firefox而不是Chrome读取时为什么挂起?

  3. 如何避免挂起?

c# google-chrome-extension firefox-addon
1个回答
0
投票

如下更改循环:

using (var reader = new StreamReader(stdin))
{
  var offset = 0;
  while (offset < length && reader.Peek() >= 0)
  {
    offset += reader.Read(buffer, offset, length - offset);
  }
}

键更改是在offset < length条件下使用while,以便在读取所有预期字符后不调用reader.Peek()。此版本还处理返回少于reader.Read()个字符的length,因此需要多个循环才能读取整个消息。我不知道是否会发生。通常,尽管如此,流的read方法可能不会返回所有请求的字符。

更新后的循环正在运行,所以我已经回答了我的最后一个问题,如何避免挂起?

[我假设reader.Peek()在阅读Firefox消息时挂起,因为Chrome和Firefox在其一侧处理流的方式有所不同。对此有更好的理解可能会回答我的前两个问题。

我仍然不明白为什么我在stackoverflow和其他地方发现的所有示例都使用了读取循环的第一个版本,而没有其他人挂起。我知道对Chrome的关注要比对Firefox的关注多得多,也许是这样,或者也许大多数使用本机消息传递的应用程序都在使用短信,或者两者兼而有之。

© www.soinside.com 2019 - 2024. All rights reserved.