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