是否可以以Console.ReadLine()编程方式停止?
我有一个控制台应用程序:大部分逻辑运行在不同的线程上,在主线程中我接受输入使用Console.ReadLine().当分离的线程停止运行时,我想停止从控制台读取.
我怎样才能做到这一点?
我的控制台应用程序正在执行一个完全专注于用户界面的线程,它花了很多时间阻塞Console.ReadLine()(这个调用花费时间深入Windows的内部,在.NET框架的控制之外).
我需要中止这个帖子.但是,以下代码似乎不起作用:
this.UserInterfaceThread.Abort();
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?Thread.Interrupt()会有用吗?
更新
正如汉斯帕斯特所指出的:
当CLR中止时,CLR对线程的状态施加了相当明智的规则.Thread.Abort()的危险是众所周知的,当然不能可靠地工作就是中止正在执行非托管代码的线程.调用Console.ReadLine()时就是这种情况,该线程深埋在Windows操作系统代码中.
解决方案是简单地将[enter]键击到当前运行的控制台应用程序中,该应用程序取消阻止Console.ReadLine(),以便线程立即中止.
我们不能使用SendKeys,因为这是特定于Windows窗体,它还需要当前窗口具有焦点.
解决方案是使用inputsimulator.codeplex.com上的库来封装Windows SendInput()调用.
请参阅示例代码:
我需要在控制台中询问输入并等待几秒钟后我需要默认为某个值.基本上如何在c#中控制台输入并继续默认设置?如果你有一个很棒的示例代码.
假设我的控制台程序执行多个冗长的任务.在这些任务之间,我希望它暂停 - 无论是几秒钟还是直到任何按键被按下.(以先到者为准.)
这些标准很容易自行检查,但是当我尝试组合它们时它们拒绝相处:在ReadKey启动之前,计时机制暂停几秒钟,或者 Readkey完全阻塞线程直到满意为止.我怎样才能满足这两个条件?
我已经构建了一个简单的控制台应用程序,我需要给用户一个特定的时间来输入一个keychar.
我应该用这个吗?
System.Threading.Thread.Sleep(1000);
Run Code Online (Sandbox Code Playgroud)
对于那些谁不明白,我需要的程序跳过Console.ReadKey().KeyChar;后x秒.
这可能吗?
我正在制作一个.bat游戏,当前在输入命令时代码是
set /p command=
Run Code Online (Sandbox Code Playgroud)
我想知道的是,如果你能以某种方式有输入命令的时间限制.例如,如果你打了一个守卫,并且你没有在5秒内发出命令,那么守卫就会攻击.
这不是一件迫切需要的事情,我只是想知道更多关于我所受到的限制,而且我认为无论如何我都知道aawer(答案是你不能)
谢谢
有什么方法可以同时检测Readline和ReadKey,因此在大多数情况下,它应该表现为readline,除了一些应该检测到的特殊按键输入之外?
我需要一些“并行”实现来引入同时性。下面的代码是同步的,不能满足我的需要
while ((line = Console.ReadLine()) != "x")
{
if (line == "BLABLA")
{
//Stuff
}
else
{
//Stuff
}
ConsoleKeyInfo ki = Console.ReadKey(true);
if ((ki.Key == ConsoleKey.V) && (ki.Modifiers == ConsoleModifiers.Control))
{
//Stuff
}
}
Run Code Online (Sandbox Code Playgroud) 我只是想知道是否可能以及如何实现此功能,如果没有来自用户的输入,我们将退出循环.例如,如果用户在1分钟后没有输入任何内容,我想退出循环.这是我的C代码:
#include <stdio.h>
#include <conio.h>
#include <time.h>
int main(void)
{
int x;
time_t end = time(0) + 60;
printf("Enter a number : ");
while (time(0) < end)
{
if((scanf("%d", &x)) != EOF || (getchar() != '\n'))
{
time_t end2 = time(0) + 60;
while(time(0) < end2);
main();
}
else
{
printf("%d", x);
main();
}
}
main();
}
Run Code Online (Sandbox Code Playgroud) 对于控制台应用程序,我需要知道如何在设定的时间(大约10秒)内等待用户输入一个或一组键,然后再继续应用程序的"自动运行"部分.
这是困扰我,因为我无法弄清楚计时器是如何工作的,或者是threading.sleep,我应该使用什么?一整天都在谷歌搜索.
一些伪代码:
1.app打开
2.app等待10秒,用户点击"k"键.
3.如果用户点击k,则转到4.如果用户没有,请转到5.
4.运行一个函数(打开一个表单)
5.运行一个函数(做某事)
我打赌简单,我只是不明白发生了什么.
[控制台应用]
我想在计时器上有一个方法(Thread.Sleep)并在它旁边运行另一个方法,等待用户的响应.如果计时器在用户可以响应(ReadKey)之前耗尽,那么它们将失去生命.
简而言之,我怎样才能在计时器上安装ReadKey?
有没有办法将[enter]键击到当前进程中,强制在Console.ReadLine()上阻塞线程?
更多信息(你可以忽略这个)
我有一个C#控制台应用程序正在运行另一个在Console.ReadLine()上阻塞的线程.由于Console.ReadLine调用在Windows中非托管代码的内部深处运行的本机Windows线程,因此在解除阻塞之前它不会中止,并且直到它在键盘上接收到按键才会发生.
因此,当我在这个线程上调用".Abort"时,在C#.NET中,直到我在控制台上手动按[enter]才会这样做.我想自动化这个按键.
可能的重复:
如何向 Console.ReadLine() 添加超时?
如果我有一个 Console.ReadKey(),它会使整个程序卡住,我怎样才能让它读取密钥 1 秒,如果未读取密钥,则会设置其他内容。