Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在鼠标单击时检测控制台应用程序冻结_C#_Console Application - Fatal编程技术网

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

C# 如何在鼠标单击时检测控制台应用程序冻结,c#,console-application,C#,Console Application,我有一个简单的WCF服务,在测试时在控制台中运行。有时我想让控制台窗口位于其他窗口之上,所以我单击它。这将激活“标记并粘贴”命令,然后冻结整个应用程序(服务变得无响应),直到我按enter键 我觉得那很烦人 我不想禁用“标记并粘贴”,因为有时我会从控制台复制文本 有没有办法检测到应用程序已冻结? 如果我知道什么时候会发生这种情况,我可能会更改windows titel以显示警告 编辑: 这不是重复,因为我想知道如何处理冻结,而不是为什么它感觉冻结。我现在知道,只有对输出的写入被冻结,这会使我的应

我有一个简单的WCF服务,在测试时在控制台中运行。有时我想让控制台窗口位于其他窗口之上,所以我单击它。这将激活“标记并粘贴”命令,然后冻结整个应用程序(服务变得无响应),直到我按enter键

我觉得那很烦人

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

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

如果我知道什么时候会发生这种情况,我可能会更改windows titel以显示警告

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

如前所述,在此模式下,终端只是停止从应用程序输出读取,这会导致对该输出的写入(例如
控制台.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;
} 
并使用此方法代替常规的
控制台.WriteLine
。当然,这是有限的用途,但我认为它回答了你的问题

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

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

并注意控制台标题将更改为冻结!当您处于该模式时,当您退出该模式时,它将重新更改。

冻结的应用程序无法检测到任何东西。如果你想复制文本,你必须记录它可能是@RvdK的副本,正如副本所示,如果控制台是唯一冻结的,那么在后台记录消息的日志库,甚至使用缓冲的日志库都不会被冻结affected@PanagiotisKanavos当前位置它只是感觉冻结了,但实际上并没有冻结。对不起,我的英语能力已经到了极限。请随意编辑以使其更清晰。这是一个功能,而不是一个bug。与按Ctrl+S键时的冻结方式没有任何不同。至少要配置控制台,以避免意外触发,请按Alt+Space>Properties>Options tab>untick“QuickEdit mode”。我非常喜欢,谢谢!我要试一试。唯一但:我认为在您的解决方案中,如果有大量内容写入控制台,则顺序不再得到保证。@flayn此代码是连续的,因此顺序是有保证的(前提是您始终执行
wait WriteLine(“…”)
)。虽然它使用了
Task.Run
,但这里没有类似的东西(请注意,最后,
Console.WriteLine
总是使用
wait writeTask
等待)。