C#控制台应用运行一天后暂停读取MSMQ,右键控制台才恢复
解决C#控制台程序读取MSMQ时自动暂停的问题
这个问题我之前踩过类似的坑!大概率是控制台默认开启的快速编辑模式在搞鬼,和你提到的"Console Application 'pausing'"问题完全匹配。
问题原因
当控制台窗口开启快速编辑模式时,哪怕是不小心误点了窗口区域(无人值守的程序很容易出现这种情况),系统会自动暂停程序的执行,直到你右键窗口或者按下回车才会恢复运行。你的程序运行一天后突然停住,就是因为触发了这个机制。
解决方案1:禁用控制台快速编辑模式
手动改控制台属性虽然能解决,但部署到服务器后太麻烦,直接在代码里禁用更靠谱。可以调用Win32 API来修改控制台模式:
using System; using System.Runtime.InteropServices; public static class ConsoleHelper { private const uint ENABLE_QUICK_EDIT_MODE = 0x0040; private const uint ENABLE_INSERT_MODE = 0x0020; [DllImport("kernel32.dll", SetLastError = true)] private static extern IntPtr GetStdHandle(int nStdHandle); [DllImport("kernel32.dll", SetLastError = true)] private static extern bool GetConsoleMode(IntPtr hConsoleHandle, out uint lpMode); [DllImport("kernel32.dll", SetLastError = true)] private static extern bool SetConsoleMode(IntPtr hConsoleHandle, uint dwMode); public static void DisableQuickEdit() { var inputHandle = GetStdHandle(-10); // 获取标准输入句柄 if (!GetConsoleMode(inputHandle, out var currentMode)) { // 这里可以加日志记录获取模式失败的情况 return; } // 移除快速编辑和插入模式的标志位 currentMode &= ~ENABLE_QUICK_EDIT_MODE; currentMode &= ~ENABLE_INSERT_MODE; SetConsoleMode(inputHandle, currentMode); } }
在程序启动的入口(比如Main方法开头)调用ConsoleHelper.DisableQuickEdit();,这样程序一运行就会自动禁用快速编辑模式,再也不会因为误点窗口暂停了。
额外检查:线程计数的线程安全性
看你给出的downloadHandler代码里用到了CURRENT_ACTIVE_THREAD和MAX_THREAD的判断,如果这个计数变量是多线程操作的,一定要确保线程安全!比如用Interlocked类来增减计数:
// 当启动新线程时,安全增加计数 Interlocked.Increment(ref CURRENT_ACTIVE_THREAD); // 当线程结束时,安全减少计数 Interlocked.Decrement(ref CURRENT_ACTIVE_THREAD);
如果没有正确同步,可能会导致逻辑上的假死(看起来像是暂停,但其实是循环卡住),虽然这不是你当前问题的主因,但也是长期运行程序的潜在隐患,建议一起处理。
总结
先禁用控制台的快速编辑模式,这应该能直接解决你右键窗口才恢复的问题;再检查线程计数的线程安全性,确保程序长期稳定运行。
内容的提问来源于stack exchange,提问作者user2905416
相关产品推荐
相关产品推荐

