[我在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()
在第一次通过循环后挂起。
为什么reader.Peek()
挂起?
为什么从Firefox而不是Chrome读取时为什么挂起?
如何避免挂起?
如下更改循环:
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的关注多得多,也许是这样,或者也许大多数使用本机消息传递的应用程序都在使用短信,或者两者兼而有之。