【发布时间】:2017-10-17 14:49:48
【问题描述】:
来自this answer和Docs,它说对于并发流访问,如果有一个唯一的读取线程和一个唯一的写入线程,则可以毫无问题地执行读取和写入。
我有以下设置,如下图所示:
我有 2 个独立的服务 Tester Service 和 My Service。他们每个人都有一个Server 和一个Client。每个服务器和客户端都有 2 个任务 WriterTask 和 ReaderTask。
我面临的问题是,经过一段时间后,客户给出了IOException 10060。事实上,另一边的服务器运行良好。
现在,文档说有一个用于读/写操作的唯一线程,如果它在同一台机器上会不会有问题?
以前有没有人遇到过类似的情况?
服务器阅读器:
private void ReaderTask(NetworkStream stream)
{
while (true)
{
// Some code
try
{
if (stream.CanRead)
{
var readTask = Task.Run(() =>
{
MyObj message = null;
try
{
message = Deserialize<MyObj>(stream);
Console.WriteLine("ReaderTask: Read");
// Some code
}
catch (IOException e)
{
Console.WriteLine("ReaderTask: " + e.Message);
}
return message;
});
while(!readTask.Wait(1000))
{
Console.WriteLine("ReaderTask: Wait 1000");
}
if (readTask.Result != null)
{
Console.WriteLine("ReaderTask: Message received" + readTask.Result.toString());
}
}
}
catch (IOException e)
{
Console.WriteLine("ReaderTask: " + e.Message);
}
}
}
客户作家:
private void WriterTask(NetworkStream stream)
{
while (true)
{
// Some code
try
{
if (stream.CanWrite)
{
// message = getMessage();
Serialize(stream, message);
Console.WriteLine("WriterTask: Write");
// Some code
}
}
catch (IOException e)
{
Console.WriteLine("WriterTask: " + e.Message);
}
Thread.Sleep(1000);
}
}
【问题讨论】:
-
是的,我遇到了类似的情况,问题出在我的代码中,与读写线程之间的分离无关。你怎么知道“服务器运行良好”?当前是否有线程阻塞正在崩溃的客户端的
NetworkStream.Read()操作? -
@C.Evenhuis “服务器运行良好” - 服务器的读取器和写入器任务正在生成日志。所以我知道他们很好。但是服务器的读取器任务正在读取无限期阻塞的异步任务中的流。我在下面的答案中提供了详细信息。如果您有更多信息,最好发布答案并填写更多详细信息。
标签: c# multithreading sockets