Почему мой C# собственный узел обмена сообщениями зависает при чтении сообщения, отправленного расширением браузера Firefox? - PullRequest
0 голосов
/ 14 апреля 2020

Я видел несколько C# примеров собственного хоста обмена сообщениями в stackoverflow, которые используют этот код для чтения сообщения от 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. Однако теперь я отправляю более длинные сообщения (около 2 КБ), и reader.Peek() зависает после первого прохода через l oop.

  1. Почему reader.Peek() висит?

  2. Почему зависает при чтении с Firefox, а не Chrome?

  3. Что можно сделать, чтобы избежать зависания?

1 Ответ

0 голосов
/ 14 апреля 2020

Измените l oop следующим образом:

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 символов, так что для чтения всего сообщения требуется несколько циклов. Я не знаю, может ли это произойти. В целом, однако, метод чтения потока может не вернуть все запрошенные символы.

Обновленный l oop работает, поэтому я ответил на последний из моих вопросов, Что я могу сделать, чтобы избежать зависания?

Я предполагаю, что reader.Peek() зависает при чтении сообщения Firefox из-за некоторой разницы между тем, как Chrome и Firefox обрабатывают поток на их стороне. Лучшее понимание этого, вероятно, ответило бы на мои первые два вопроса.

Я до сих пор не понимаю, почему все примеры, которые я нашел в stackoverflow и в других местах, использовали первую версию чтения l oop и никто другой упомянутые зависания. Я знаю, что Chrome уделяется гораздо больше внимания, чем Firefox, так что это может быть, или, возможно, большинство приложений, использующих собственный обмен сообщениями, используют короткие сообщения или оба.

...