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

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

【问题讨论】:

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

标签: c# console-application nonblocking


【解决方案1】:

Richard Duttonhis 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什么时候会被触发?我认为只有当您到达流的末尾或缓冲区已满时,而不是只有几个输入字符可用时才到达。
  • 啊。你是对的。实际上,流似乎只在回车时被刷新。你的方法看起来越来越好!
  • 如果没有可阅读的内容,似乎不起作用(挂起)。阻止。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-24
  • 1970-01-01
  • 1970-01-01
  • 2018-10-14
  • 2011-03-12
  • 1970-01-01
  • 2018-04-06
相关资源
最近更新 更多