- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在多线程程序中使用 Console.ReadKey()
时遇到了一个奇怪的问题。
我的问题是:为什么会这样?这是一个错误,还是因为我在滥用 Console
?(请注意,控制台应该是线程安全的,according to the documentation。)
用代码来解释这个最简单:
using System;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApplication2
{
internal class Program
{
private static void Main(string[] args)
{
Console.WriteLine("X"); // Also try with this line commented out.
Task.Factory.StartNew(test);
Console.ReadKey();
}
private static void test()
{
Console.WriteLine("Entering the test() function.");
Thread.Sleep(1000);
Console.WriteLine("Exiting the test() function.");
}
}
}
如果您运行它并且不按下某个键,您认为它会打印出什么?
答案如你所料:
X
Entering the test() function.
Exiting the test() function.
现在注释掉 Console.WriteLine("X")
并再次运行它(不用按键)。我希望看到这个输出:
Entering the test() function.
Exiting the test() function.
相反,我什么都看不到。然后当我按下一个键时,它会说:
Entering the test() function.
...就是这样。程序退出(当然)并且它没有时间到达下一个 WriteLine()
。
我觉得这个行为很神秘。这很容易变通,但我很好奇为什么会这样。
[编辑]
如果我在 Console.ReadKey()
之前添加一个 Thread.Sleep(1)
,它会按预期工作。当然,这不是必需的,因为 Console.ReadKey()
应该永远等待。
所以看起来它可能是某种竞争条件?
更多信息:Servy 发现(我已经复制)Console.WriteLine("Entering the test() function.")
行一直阻塞,直到按下任何键。
构建配置
Visual Studio 2012,Windows 7 x64,四核,英语(英国)。
我已经尝试了 .Net4、.Net4.5、x86、AnyCPU 以及调试和发布的所有组合,但它们都无法在我的 PC 上运行。但是一件非常奇怪的事情发生了。当我第一次尝试 .Net4 的 AnyCPU 版本时它开始工作,但随后它再次停止工作。看起来非常像只影响某些系统的竞争条件。
最佳答案
这是一个竞争条件。这是第一个 Console.WriteLine 不存在时发生的情况:
当 Console.WriteLine 保留在那里时它表现不同的原因是因为对 Console.InitializeStdOutError 的调用没有与 Console.ReadKey 并行发生。
所以简短的回答是:是的,你在滥用控制台。您可以自己初始化控制台(通过取消引用 Console.Out),或者您可以在启动任务后但在 ReadKey 之前等待事件,然后让任务在第一次调用 Console.WriteLine 后发出事件信号。
关于c# - 多线程 Console.ReadKey() 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15143931/
已经有几个关于捕获或重定向 console.log 的问题: redirect Javascript syntax errors and console.log to somewhere else C
console.log(String(console.log('Not undefined')) === 'undefined'); console.log(String(console.log('N
我知道这是一个新手错误,但我不知道如何修复它。 public static void main (String args[]){ Console kitty = System.console(); S
我正在使用 Visual Studio 2015。 我试图打印一些语句只是为了跟踪一个非常长时间运行的测试。当使用 VSTest.Console 和/Logger:trx 时,调试输出(无论我们使用
这个问题在这里已经有了答案: Accessing console and devtools of extension's background.js (8 个回答) 5年前关闭。 我的 Chrome
我在括号中收到此错误。 我想强调一个事实,这是我第二次打开 JS 文件。 正如我强调的那样,我还想强调一个事实,即我不知道 Eslint 和 node.js 是什么。 StackOverflow 和其
我按照文档中的描述安装了 Drupal Console Launcher: curl https://drupalconsole.com/installer -L -o drupal.phar mv
Console.WriteLine() 和有什么区别和Trace.WriteLine() ? 最佳答案 从“调试”的角度来看这些。 我们开始使用 Console.WriteLine() 进行调试 后来
我一直在尝试连接到 serial console of a Raspberry Pi 3 with Android Things使用USB to TTL cable从我的 Linux (Ubuntu)
namespace Pro { class ErrorLog { public ErrorLog(RenderWindow app) {
以下代码是一个众所周知的示例,用于显示调试版本和发布版本之间的区别: using System; using System.Threading; public static class Program
if (open_date) { open_date = get_date_from_string(open_date); window.console && cons
在 Xcode 中工作时,我通常只为控制台打开一个单独的窗口,以便我可以看到尽可能多的输出行。我今天刚刚更新到 Xcode 12,在更新之前,您可以将编辑器 Pane 和控制台 Pane 之间的分隔线
在 Google Play Console 上,在所有应用程序的第一页,它会显示已安装的受众和用户获取。 我知道已安装的受众是在他们的设备上安装我的应用程序的受众。但什么是用户获取?通常,用户获取的数
Qt Quick uses qDebug执行日志记录,其中标准 Javascript 日志记录方法映射到 Qt 日志类型 console.log() -> qDebug() console.deb
Qt Quick uses qDebug执行日志记录,其中标准 Javascript 日志记录方法映射到 Qt 日志类型 console.log() -> qDebug() console.deb
我有以下代码: bool loop = true; LongbowWorkerThread Worker = new LongbowWorkerThread(); Th
我遇到了这两个 API,用于在 C# 的简单控制台应用程序中读取用户的输入: System.Console.ReadLine() System.Console.In.ReadLine() 这是一个我试
我是编程和 js 的新手,我正在尝试学习 javascript 的关键。 var obj1 = { name: 'rawn', fn: function() { con
using System; namespace ConsoleApplication1 { class Program { static void Main(strin
我是一名优秀的程序员,十分优秀!