我试图在控制台应用程序上一次读取一系列输入的字符:
while(true) { var input= string.Empty; do { var key = Console.ReadKey(); input += key.KeyChar; } while (input.Length <= 5); //do something with input. }
由于没有回车,我可以通过为输入设置固定长度来完成这项工作.但实际上我不知道一次会输入多少个字符......它可能是1到10之间的任何地方.无论如何修改上面的代码以便应用程序可以接收一次输入的内容吗?唯一分隔不同输入的是时间(可以假设至少2或3秒),因为没有回车.
因此,我认为使用超时来判断用户是否已完成,这是一个可怕的想法,您可以通过以下方式实现:
var input = string.Empty; var lockObj = new Object(); System.Threading.Timer timer = new System.Threading.Timer(o => { string localInput; lock(lockObj) { localInput = input; input = string.Empty; } Console.WriteLine("\noutput: {0}", localInput); }, null, System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite); while (true) { var key = Console.ReadKey(); timer.Change(2000, System.Threading.Timeout.Infinite); lock(lockObj) { input += key.KeyChar; } }
当按下一个键并且当该计时器到期时(假设它没有被另一个按键取消),你启动一个计时器(取消任何前一个计时器),你可以使用当前的任何值进行操作input
.注意:由于您现在处于多线程状态,因此您需要担心您正在做的事情是什么以及它是否是线程安全的.您可能必须锁定或同步.