在同一台计算机上同时访问网络流

时间:2017-10-17 14:49:49

标签: c# multithreading sockets

this answerDocs,它表示对于并发流访问,如果有一个唯一的读取线程和一个唯一的写入线程,则读取和写入都可以顺利执行。< / p>

我正在进行以下设置,如下图所示:

我有2个单独的服务Tester ServiceMy Service。他们每个人都有一个Server和一个Client。每个服务器和客户端都有2个任务WriterTaskReaderTask

我面临的问题是,经过一段时间后,客户端会提供IOException 10060。事实上,另一边的服务器运行良好。

现在,文档说一个独特的读/写操作线程,如果它在同一台机器上会有问题吗?

其他人之前遇到过类似情况吗?

enter image description here

服务器阅读器:

    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);
        }
    }

1 个答案:

答案 0 :(得分:1)

我弄清楚问题是什么。

我没有从我的服务器接收任何数据,因为我没有像这样client.ReceiveTimeout = 2000在客户端设置接收超时。因此,服务器会在读取呼叫时阻止它ReaderTask

我不能100%确定为什么当客户端WriterTask写入流时,服务器的ReaderTask将不会读取任何内容并保持阻止状态。但是,一旦我在服务器中的客户端对象上设置超时,一切都开始正常运行。

那么,如果具有唯一ReaderTaskWriterTask的应用程序位于同一台计算机上,是否会出现问题?当您使用接收超时时,根本没有问题。没有收到超时,它没有正常工作(至少在我的情况下)。