如何解决基本Stream / StreamReader类中没有同步的非阻塞读取方法
最近我正在尝试使用BouncyCastle库尝试一些.Net.Sockets安全联网。
BouncyCastle中的TlsStream类继承了原始的Stream
(不是NetworkStream
),并且StreamReader
/ StreamWriter
似乎是一种方便的读写方式。
由于我倾向于在1个端点(服务器或客户端)上使用1个线程来处理read
和write
:
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中进行同步,但是我认为这需要进行基准测试才能验证。
您是否有某些特定原因不想使用异步方法?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。