编程语言
首页 > 编程语言> > 鼠标单击时如何检测控制台应用程序冻结

鼠标单击时如何检测控制台应用程序冻结

作者:互联网

我有一个简单的WCF服务,可以在测试时在控制台中运行.有时我想将控制台窗口置于其他窗口之上,因此我单击它.这将激活“标记和粘贴”命令,然后冻结整个应用程序(服务无响应),直到我按Enter键为止.

我觉得这很烦人.

我不想禁用“标记和粘贴”,因为有时我会从控制台复制文本.

有什么方法可以检测到应用程序被冻结吗?

如果我知道是什么时候,可以更改窗口标题以显示警告.

编辑:
这不是重复的,因为我想知道如何处理冻结,而不是为什么感觉冻结.我现在知道只有对输出的写入被冻结,这使我的应用程序感觉像是被冻结了.

解决方法:

in this answer所述,在此模式下,终端仅停止从应用程序输出中读取,这会导致对该输出的写入(例如Console.WriteLine(…))挂起.

如果您控制写入控制台的代码,则可以实现您的目标(在检测到“冻结”时更改控制台标题),如下所示:

static async Task WriteLine(string text) {            
    var delay = Task.Delay(TimeSpan.FromSeconds(1));
    var writeTask = Task.Run(() => Console.WriteLine(text));
    var oldTitle = Console.Title;
    if (await Task.WhenAny(delay, writeTask) == delay) {
        // after one second Console.WriteLine still did not return
        // we are probably in "mark and paste" mode
        Console.Title = "FREEZED!";
    }
    // we cannot ignore our write, have to wait anyway
    await writeTask;
    Console.Title = oldTitle;
} 

并使用此方法代替常规的Console.WriteLine.当然,这种用法用途有限,但我认为它可以回答您的问题.

您可以使用以下简单方法进行测试:

static async Task Main(string[] args) {
    while (true) {
        await WriteLine("test");
        Thread.Sleep(1000);
    }
}

并注意控制台标题将变为FREEZED!在这种模式下,当您退出该模式时,它会变回原来的状态.

标签:console-application,c
来源: https://codeday.me/bug/20191109/2011511.html