gpt4 book ai didi

c# - 使用 Task.Run() 写入控制台失败

转载 作者:可可西里 更新时间:2023-11-01 08:25:33 24 4
gpt4 key购买 nike

我的一位同事发现我们的代码存在问题,花了一段时间才查明到底发生了什么,但这个简单的例子可以最好地证明这一点:

// Fails
class Program
{
static void Main(string[] args)
{
Task.Run(() => Console.WriteLine("Hello World"));
Console.ReadKey();
}
}

// Works fine
class Program
{
static void Main(string[] args)
{
Console.Write(String.Empty);
Task.Run(() => Console.WriteLine("Hello World"));
Console.ReadKey();
}
}

通过玩这个很明显,从主线程的任何地方写入控制台将允许后台线程也写入控制台,但我们正在努力理解为什么会发生这种情况。任何人都可以解释从主线程写入控制台可以实现第一个代码片段无法实现的效果吗?

最佳答案

我怀疑发生了什么。我观察到的:

  • 如果您在启动 ReadKey 之前对控制台的输出做任何,就没问题。这包括获取 Console.Out 但不使用它
  • 如果您延迟 Console.WriteLine 调用Console.ReadKey 调用之前开始,这很好(而且您可以有多个 WriteLine 调用 ReadKey 正在等待

我怀疑使用控制台的第一个操作获取了初始化锁(以避免它被初始化两次)并且 ReadKey 方法保持锁直到一个键被读取。这肯定可以解释我迄今为止运行的每个程序。

虽然执行假设初始化的操作很有趣 - 读取 Console.Out 可以“解决”问题,但读取 Console.In 则不能。

我怀疑 ReadKey 初始化了输出,因为该值仍然回显到控制台...但我不想发誓。

有趣的是,使用 Console.ReadLine() 而不是 Console.ReadKey() 并不会首先导致问题。

关于c# - 使用 Task.Run() 写入控制台失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14384064/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com