鼠标单击时如何检测控制台应用程序冻结
作者:互联网
我有一个简单的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