写使用Task.Run控制台()失败(Writing to the console using Ta

2019-08-07 05:00发布

我的一位同事发现了我们的代码的问题,过了好一会儿,追捕究竟发生了什么事,但它可以通过这个简单的例子来证明最好的:

// 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();
    }
}

这是一个从这个玩弄从主线程写入到控制台的任何地方可以让后台线程写入到控制台还不清楚,但我们正在努力理解为什么发生这种情况。 谁能解释什么实现写入主线程控制台的第一个片段不?

Answer 1:

我有一个怀疑为发生了什么事情。 我观察到:

  • 如果您在开始之前做控制台的任何输出ReadKey ,它的罚款。 这包括获取Console.Out但没有使用它
  • 如果你把一个延迟,使得Console.WriteLine调用之前启动 Console.ReadKey通话,它的罚款(你可以有多个WriteLine调用 ReadKey是等待

我怀疑使用控制台第一操作获取用于初始化一个锁(以避免它被初始化两次),而且ReadKey方法保持锁的保持 ,直到键已经被读取。 这当然可以解释每次我跑这么远程序。

其执行虚拟初始化的操作是有趣的,但-读Console.Out “修复”的问题,而是从阅读Console.In没有。

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

有趣的是,使用Console.ReadLine()代替Console.ReadKey()不会导致在第一位置的问题。



Answer 2:

事实上,第一种情况不会失败。 的“Hello World”出现在应用程序就结束了。 这是一个经典的比赛条件 。 在第一种情况下, Console.ReadKey()主线程跳动的任务,在第二种情况下,任务胜。 不幸的是,我不能告诉你究竟为什么写一个空字符串使得任务胜利。



文章来源: Writing to the console using Task.Run() fails
标签: c# .net-4.5