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

时间:2018-04-20 11:26:19

标签: c# console-application

我有一个简单的WCF服务,我在测试时在控制台中运行。有时我想把控制台窗口放在其他窗口的顶部,所以我点击它。这将激活“标记和粘贴”命令,然后冻结整个应用程序(服务变得无法响应),直到我按下回车键。

我发现这很烦人。

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

有没有办法检测到应用程序被冻结了?

如果我知道在什么情况下,我可以更改窗口标题以显示警告。

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

1 个答案:

答案 0 :(得分:3)

正如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!当你处于那种模式时,当你离开它时会改变。