网络阻塞到非阻塞,只有线程作为选项?

Posted

技术标签:

【中文标题】网络阻塞到非阻塞,只有线程作为选项?【英文标题】:Networking blocking to non-blocking, only threads as option? 【发布时间】:2012-04-07 20:24:25 【问题描述】:

所以我已经使用 C# 一天了。我正在编写的第一个应用程序是一个简单的基于控制台的 IRC-Client,但它比我想象的要难。由于我正在从两个流中读取数据:控制台和 irc-server,因此我需要某种非阻塞 I/O。

目前我有以下代码:

while (((sInput = sr.ReadLine()) != null) || ((uuInput = Console.ReadLine()) != null))
                
                    // stuff
                

但是,这将始终执行 sInput,因为 .ReadLine() 是阻塞的,因此最终会在最后返回 True,因此 OR 的第二个块永远不会被执行。

解决办法是什么?用线程自己实现它?我似乎在标准 C# 库中找不到任何 NIO 库。我更喜欢有一个小而干净的解决方案,因为我不想让这个程序过于复杂。

任何帮助都会非常好。谢谢。

【问题讨论】:

仅供参考:您要寻找的是使用异步调用处理 IO;你不想要非阻塞套接字。 【参考方案1】:

在学习 C# 时,您肯定已经深入了解了。根据您设置的问题标签,我假设您在网络方面的帮助比直接输入/输出问题更多。公平地说,无论您使用哪种语言,网络都绝对不是微不足道的。也许帮助您的最佳方法是为您指明一个示例的方向,该示例演示您正在尝试实现的内容。 networkComms.net,一个开源网络库有一个聊天应用程序的例子,here(只有 11 行长)。如果您在看过之后有任何问题,请告诉我。

【讨论】:

【参考方案2】:

您可以尝试使用异步操作,例如 BeginRead(),但这意味着使用 Stream 而不是 StreamReader

所以,我认为在您的情况下,是的,如果您创建另一个线程并在那里执行另一个阻塞调用,那将是最简单的。但是如果你这样做了,不要忘记同步对两个线程共享的任何资源的访问,可能是使用lock

【讨论】:

以上是关于网络阻塞到非阻塞,只有线程作为选项?的主要内容,如果未能解决你的问题,请参考以下文章

非阻塞套接字轮询与阻塞套接字

概念理解同步异步阻塞非阻塞

(51)LINUX应用编程和网络编程之六Linux高级IO

阻塞非阻塞同步异步

多路复用 阻塞/非阻塞IO模型 网络IO两个阶段

java nio学习三:NIO 的非阻塞式网络通信