网络阻塞到非阻塞,只有线程作为选项?
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
。
【讨论】:
以上是关于网络阻塞到非阻塞,只有线程作为选项?的主要内容,如果未能解决你的问题,请参考以下文章