从this answer和Docs,它表示对于并发流访问,如果有一个唯一的读取线程和一个唯一的写入线程,则读取和写入都可以顺利执行。< / p>
我正在进行以下设置,如下图所示:
我有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);
}
}
答案 0 :(得分:1)
我弄清楚问题是什么。
我没有从我的服务器接收任何数据,因为我没有像这样client.ReceiveTimeout = 2000
在客户端设置接收超时。因此,服务器会在读取呼叫时阻止它ReaderTask
。
我不能100%确定为什么当客户端WriterTask
写入流时,服务器的ReaderTask
将不会读取任何内容并保持阻止状态。但是,一旦我在服务器中的客户端对象上设置超时,一切都开始正常运行。
那么,如果具有唯一ReaderTask
和WriterTask
的应用程序位于同一台计算机上,是否会出现问题?当您使用接收超时时,根本没有问题。没有收到超时,它没有正常工作(至少在我的情况下)。