C# StreamReader 与 NetworkStream 挂起
C# StreamReader hangs with NetworkStream
所以我已经弄乱这段代码一段时间了,但无法弄清楚为什么它不起作用
(我在 while(true)
循环中的两个不同线程上调用了 Serialize
方法和 Deserialize
,Serialize
线程继续发送,而 Deserialize
方法卡住了)
public static void Serialize(NetworkStream stream, object obj)
{
StreamWriter writer = new StreamWriter(stream);
Console.WriteLine("Start Writing");
writer.WriteLine(Deconstructor.Deconstruct(obj));
Console.WriteLine("Done Writing");
}
public static object Deserialize(NetworkStream stream)
{
StreamReader reader = new StreamReader(stream);
Console.WriteLine("Start reading");
string objGraphData = reader.ReadLine();
Console.WriteLine("Done reading");
return Constructor.Construct(objGraphData);
}
输出:
Accepting new socket!
Start reading
Start Writing
Done Writing
Start Writing
Done Writing
Start Writing
Done Writing
Start Writing
Done Writing
Start Writing
Done Writing
Start Writing
Done Writing
Start Writing
Done Writing
注意:流也能正常工作(我之前用 BinaryFormatter 测试过它们)但现在当我使用 StreamWriter/StreamReader 而不是 BinaryFormatter 时,StreamReader 部分挂在 reader.ReadLine()部分
这里最大的问题似乎是您有一个 StreamReader
(和编写器),它对于单个反序列化(或序列化)调用是本地的。但是,StreamReader
和 StreamWriter
是有状态的类型,它们有自己的本地缓冲区(因为如果你读得太多,你就不能将数据推回 Stream
,而你不出于性能原因,不想读取单个 byte
值 - 所以它读取一个块,然后通过多次调用对其进行解码)。
因此,一旦您在 Stream
上创建了 reader/writer,您需要将 reader/writer 视为该数据的唯一“所有者”。实际上,只创建一个,然后不再直接与流对话。保留 reader/writer,并将 same reader/writer 传递给多个连续的 serialize/deserialize 调用。
所以我已经弄乱这段代码一段时间了,但无法弄清楚为什么它不起作用
(我在 while(true)
循环中的两个不同线程上调用了 Serialize
方法和 Deserialize
,Serialize
线程继续发送,而 Deserialize
方法卡住了)
public static void Serialize(NetworkStream stream, object obj)
{
StreamWriter writer = new StreamWriter(stream);
Console.WriteLine("Start Writing");
writer.WriteLine(Deconstructor.Deconstruct(obj));
Console.WriteLine("Done Writing");
}
public static object Deserialize(NetworkStream stream)
{
StreamReader reader = new StreamReader(stream);
Console.WriteLine("Start reading");
string objGraphData = reader.ReadLine();
Console.WriteLine("Done reading");
return Constructor.Construct(objGraphData);
}
输出:
Accepting new socket!
Start reading
Start Writing
Done Writing
Start Writing
Done Writing
Start Writing
Done Writing
Start Writing
Done Writing
Start Writing
Done Writing
Start Writing
Done Writing
Start Writing
Done Writing
注意:流也能正常工作(我之前用 BinaryFormatter 测试过它们)但现在当我使用 StreamWriter/StreamReader 而不是 BinaryFormatter 时,StreamReader 部分挂在 reader.ReadLine()部分
这里最大的问题似乎是您有一个 StreamReader
(和编写器),它对于单个反序列化(或序列化)调用是本地的。但是,StreamReader
和 StreamWriter
是有状态的类型,它们有自己的本地缓冲区(因为如果你读得太多,你就不能将数据推回 Stream
,而你不出于性能原因,不想读取单个 byte
值 - 所以它读取一个块,然后通过多次调用对其进行解码)。
因此,一旦您在 Stream
上创建了 reader/writer,您需要将 reader/writer 视为该数据的唯一“所有者”。实际上,只创建一个,然后不再直接与流对话。保留 reader/writer,并将 same reader/writer 传递给多个连续的 serialize/deserialize 调用。