Writing to the console using Task.Run() fails

后端 未结 2 1800
粉色の甜心
粉色の甜心 2021-02-19 20:51

A colleague of mine found an issue with our code and it took a while to hunt down exactly what was happening, but it can be best demonstrated by this simple example:

<         


        
相关标签:
2条回答
  • 2021-02-19 21:24

    I have a suspicion as to what's going on. What I've observed:

    • If you do anything with the console's output before starting the ReadKey, it's fine. This includes fetching Console.Out but not using it
    • If you put a delay in so that the Console.WriteLine call starts before the Console.ReadKey call, it's fine (and you can have multiple WriteLine calls while ReadKey is waiting

    I suspect that the first operation to use the console acquires a lock for initialization (to avoid it being initialized twice) and that the ReadKey method keeps hold of the lock until a key has been read. That would certainly explain every program I've run so far.

    The operations which perform the hypothesized initialization are interesting though - reading Console.Out "fixes" the issue, but reading from Console.In doesn't.

    I suspect that ReadKey initializes the output because the value is still echoed to the console... but I wouldn't like to swear to it.

    Interestingly, using Console.ReadLine() instead of Console.ReadKey() doesn't cause the problem in the first place.

    0 讨论(0)
  • 2021-02-19 21:46

    Actually, the first case doesn't fail. "Hello World" appears just before the Application ends. This is a classical Race Condition. In the first case,Console.ReadKey() from the main thread beats the task, and in the second case, the task wins. Unfortunately, I cannot tell you Exactly why writing the empty string makes the task win.

    0 讨论(0)
提交回复
热议问题