Windows控制台应用程序卡住了(需要按键),即在运行中无响应,需要按键才能继续。

38

我有一个控制台程序,其中有不同的组件以以下方式运行:

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。我的问题是有时应用程序表现良好,但会突然停止,如果我在窗口上按任何键,它就会重新开始工作。虽然这种情况不太频繁,但我已将此程序部署在运行24/7的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);

尝试注释掉 DoSomething(); 并查看它是否表现相同。 - Andrey
C#代码中的答案似乎不起作用。下面的被接受的答案可以。 - liang
1
C#代码对我不起作用。可以在这里找到一个可用的解决方案:https://dev59.com/nGYr5IYBdhLWcg3wdp8C#36720802 - Petter T
1个回答

51
如果用户不小心点击黑色控制台窗口,则光标会变成填充的白色矩形,并且应用程序会在下一个Console.Write语句处挂起,直到进行另一次单击。
当控制台窗口启用“快速编辑模式”时,这是控制台窗口的通用功能。
为了禁用该功能,您应该在运行时取消选中应用程序控制台窗口的“快速编辑模式”选项。

啊啊啊,我觉得我注意到光标改变了。下次它再发生时我会尝试确认一下。 - Luke Belbina
@nextgenneo:如果是这样,你可以通过编程来禁用它:http://bytes.com/topic/visual-basic-net/answers/366818-console-writeline-hangs-if-user-click-into-console-window - LaGrandMere
是的,太棒了。确认这就是问题所在! - Luke Belbina
@nextgenneo:在之前的评论中添加了一个链接 :) - LaGrandMere
2
有没有一种默认关闭它的方法? - Arti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接