我有一个控制台程序,它有不同的组件,运行方式如下:
void start() {
while(true){
DoSomething();
Thread.Sleep(1000*5);
}
}
我的主要入口点看起来像[伪代码]
Thread.Start(Componenet1.Start);
Thread.Start(Componenet2.Start);
while(true){
Console.Writeline("running");
Thread.Sleep(1000*5);
}
在任何地方都没有Console.Reads。我的问题是SOMETIMES应用程序将运行良好,但然后停止,如果我按下窗口上的任何键它将再次开始工作。这种情况很少发生,但我在100+ VM上部署了这个程序,并在自动化环境中全天候运行。
同样在电脑上,我有一些AHK脚本和其他操纵鼠标的东西,但不确定是否与它有任何关系。
另请注意,有时CPU可以在机器上以100%的速度运行,因此线程优先级可能是个问题吗?
解决方案:您需要禁用快速编辑模式。以下是使用C#代码执行此操作:
// http://msdn.microsoft.com/en-us/library/ms686033(VS.85).aspx
[DllImport("kernel32.dll")]
public static extern bool SetConsoleMode(IntPtr hConsoleHandle, uint dwMode);
private const uint ENABLE_EXTENDED_FLAGS = 0x0080;
static void Main(string[] args)
{
IntPtr handle = Process.GetCurrentProcess().MainWindowHandle;
SetConsoleMode(handle, ENABLE_EXTENDED_FLAGS);
答案 0 :(得分:38)
如果用户意外点击黑色控制台窗口,光标将变为填充的白色矩形,应用程序将在下一个Console.Write语句中挂起,直到另一个clic为止。
启用“QuickEdit模式”时,它是控制台窗口的一般功能。
要禁用该功能,您应该在运行时取消选中应用控制台窗口的“QuickEdit Mode”选项。