我试图在控制台应用程序上一次读取一系列输入的字符:
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秒),因为没有回车。
答案 0 :(得分:5)
因为我认为使用超时来确定用户是否完成,这是一个可怕的想法,你可以用这样的东西来实现它:
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;
}
}
当按下某个键并且当该计时器到期时(假设它没有被另一个按键取消),你启动一个计时器(取消任何一个计时器),你做了一些事情,无论目前在{{1 }}。注意:由于您现在处于多线程状态,因此您需要担心您正在做的某些是什么以及它是否是线程安全的。您可能需要锁定或同步。