基本Stream / StreamReader类中没有同步的非阻塞读取方法

问题描述

最近我正在尝试使用BouncyCastle库尝试一些.Net.sockets安全联网。
BouncyCastle中的Tlsstream类继承了原始的Stream(不是NetworkStream),并且StreamReader / StreamWriter似乎是一种方便的读写方式。

由于我倾向于在1个端点(服务器或客户端)上使用1个线程来处理readwrite

void CommunicationLoop() // Loops in Thread A
{
    while (true)
    {
        ReadFromStream(); // If data available. It always hangs/blocks here(if there's no data to be read.)
        WritetoStream(); // If user input something.
    }
}

void ReadFromStream()
{
    String line;
    while ( StreamReader.Peek() > -1 )
// Or ((line = StreamReader.ReadLine()) != null) / (Stream.Read(buff,buff.Length) > 0)
// or any synchronized Readxxx() methods.
// It always hangs/blocks here(if there's no data to be read.)
    {
        line = StreamReader.ReadLine();   
        Console.WriteLine($"Received: {line}");
    }
}

void WritetoStream()
{
    //...
}

我做了很多研究,每个人都建议使用异步方法解决问题。

  • 我想知道的是,真的没有正式的方法/功能来检查是否有数据要在StreamReader / Stream中读取,如果没有数据,那么跳过(而不是像NetworkStream.DataAvailable那样挂在那里等待输入)?

  • 此外,如果1个连接的通信不繁重,则不使用1个线程来处理服务器端的两个读/写操作(从多个客户端到一个服务器可能有多个连接)更加有效(节省资源)?

谢谢。

解决方法

我想知道,是否真的没有官方方法/函数来检查是否在StreamReader / Stream中读取数据

查看StreamReader的文档。据我所知,不使用异步方法就无法检查等待的数据。

此外,如果1个连接的通信不繁重,则不使用1个线程同时处理服务器端的读取/写入(从多个客户端到一个服务器可能有多个连接)更有效(节省资源)

这应该不比使用异步方法更有效。考虑所有客户端都空闲的情况。您的方法将为每个客户端使用1个线程。使用异步方法不会使用任何线程。假设异步方法在后端使用非阻塞IO。同步方法的开销可能会稍低一些,因为它们可以在内核而不是.Net中进行同步,但是我认为这需要进行基准测试才能验证。

您是否有某些特定原因不想使用异步方法?