我有一个简单的WCF服务,我在测试时在控制台中运行。有时我想把控制台窗口放在其他窗口的顶部,所以我点击它。这将激活“标记和粘贴”命令,然后冻结整个应用程序(服务变得无法响应),直到我按下回车键。
我发现这很烦人。
我不想禁用“标记和粘贴”,因为有时我会从控制台复制文本。
有没有办法检测到应用程序被冻结了?
如果我知道在什么情况下,我可以更改窗口标题以显示警告。
编辑: 这不是重复,因为我想知道如何处理冻结,而不是为什么它感觉冻结。我现在知道只有对输出的写入被冻结,这导致我的应用程序感觉它被冻结了。
答案 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!当你处于那种模式时,当你离开它时会改变。