记一次 .NET 某企业OA后端服务 卡死分析( 四 )

哈哈,其实也看不出什么,也没法进入内核态,所以下一步只能到网上搜搜看,其实有经验的朋友肯定猜出来了,应该是控制台启用了 快捷编辑窗口,截图如下:

记一次 .NET 某企业OA后端服务 卡死分析

文章插图
快捷编辑窗口 简而言之就是用户可以在控制台上独占这个窗口,编辑一些内容,可一旦被用户独占,那程序侧就没法输出内容到 控制台窗口 上了,只能在 内核态 傻傻等等,这应该就是形成原因,画个图大概就像下面这样 。
记一次 .NET 某企业OA后端服务 卡死分析

文章插图
将信息告诉朋友后,朋友说他用的是 Windows 服务部署,但不管是什么模式部署,注释掉 Console.WriteLine 肯定没错 。
感谢如家的 邓工 提供的禁用 快捷编辑窗口 代码 。
#region 关闭控制台 快速编辑模式、插入模式    const int STD_INPUT_HANDLE = -10;    const uint ENABLE_QUICK_EDIT_MODE = 0x0040;    const uint ENABLE_INSERT_MODE = 0x0020;    [DllImport("kernel32.dll", SetLastError = true)]    internal static extern IntPtr GetStdHandle(int hConsoleHandle);    [DllImport("kernel32.dll", SetLastError = true)]    internal static extern bool GetConsoleMode(IntPtr hConsoleHandle, out uint mode);    [DllImport("kernel32.dll", SetLastError = true)]    internal static extern bool SetConsoleMode(IntPtr hConsoleHandle, uint mode);    public static void DisbleQuickEditMode()    {        IntPtr hStdin = GetStdHandle(STD_INPUT_HANDLE);        uint mode;        GetConsoleMode(hStdin, out mode);        mode &= ~ENABLE_QUICK_EDIT_MODE;//移除快速编辑模式        mode &= ~ENABLE_INSERT_MODE;      //移除插入模式        SetConsoleMode(hStdin, mode);    }    #endregion三:总结这次卡死的事故,主要还是开发人员大量的使用 Console.WriteLine 来输出日志,在某个时刻输出端窗口因为各种原因被他人独占,导致程序侧无法输出内容到窗口而一直被迫等待,之后朋友将日志输出切换到文件模式,问题得以解决 。
其实这个问题很多新手朋友都会犯,特此记录下来 。
【记一次 .NET 某企业OA后端服务 卡死分析】

经验总结扩展阅读