从 C# 中的标准 I/O 进行非阻塞读取 [关闭]

Posted

技术标签:

【中文标题】从 C# 中的标准 I/O 进行非阻塞读取 [关闭]【英文标题】:Non-Blocking read from standard I/O in C# [closed] 【发布时间】:2011-08-02 23:58:03 【问题描述】:

我想要一个来自控制台的非阻塞读取功能。我如何用 C# 编写它?

【问题讨论】:

为什么这不是一个真正的问题?我会理解将其关闭为重复,但“不是一个真正的问题”对我来说看起来很奇怪。 @Mitch Wheat:ReadKey 不会阻塞吗? @Ondrej 引用 OP:“来自控制台” 人们会声称这太模棱两可并将其关闭,这有点令人讨厌。我通过搜索“c# 非阻塞控制台输入”来到这里,这正是我想要的。有用的问题,有用的讨论和答案。别吹毛求疵了,有些人实际上使用这个网站来完成工作。谢谢! 为什么这不是一个真正的话题。我有确切的问题。如何在 c# 的循环中对字符进行非阻塞读取。 【参考方案1】:

Richard Dutton在his blog上有解决方案:

while (true)  
  
    if (Console.KeyAvailable)  
      
        ConsoleKeyInfo key = Console.ReadKey(true);  
        switch (key.Key)  
          
            case ConsoleKey.F1:  
                Console.WriteLine("You pressed F1!");  
                break;  
            default:  
                break;  
          
      
    // Do something more useful  
 

【讨论】:

ConsoleKeyInfo 包含字段 KeyChar,它代表 char 表示,这可能是 OP 想要的。 @spender 这就是为什么会有// Do something more useful 评论。 这个答案非常适合我想要的。我有一个程序运行无限循环并输出内容,但我希望能够通过键盘字符输入命令而不会阻塞循环。 我认为这是 OP 正在寻找的真正答案,并且可能应该被标记为正确的答案。无论如何,它做了我正在寻找的东西。谢谢。 当它不是控制台时,它实际上不会从标准输入读取!【参考方案2】:
var buf=new byte[2048];
var inputStream=Console.OpenStandardInput(); //dispose me when you're done
inputStream.BeginRead(buf,0,buf.Length,ar=>
    int amtRead=inputStream.EndRead(ar);
    //buf has what you need. You'll need to decode it though
,null);

【讨论】:

你没有忘记count参数吗? 你的EndRead什么时候会被触发?我认为只有当您到达流的末尾或缓冲区已满时,而不是只有几个输入字符可用时才到达。 啊。你是对的。实际上,流似乎只在回车时被刷新。你的方法看起来越来越好! 如果没有可阅读的内容,似乎不起作用(挂起)。阻止。

以上是关于从 C# 中的标准 I/O 进行非阻塞读取 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

[Java]I/O底层原理之三:NIO

阻塞式I/0 和 非阻塞式I/O 同步异步详细介绍

Linux中的五种I/O模型

Linux 设备驱动中的阻塞与非阻塞 I/O

Java非阻塞读取[关闭]

Linux设备驱动中的阻塞和非阻塞I/O