Async weirdness

What would you expect this program to print? (it’s set to .NET Framework 4.5 as the target framework)

Untitled

I’m not a world leading expert on C#, but I would expect to see this:

  null
  World

But this is actually what you get:

  World
  World

The program attempts to read the value of ‘Result’ while the task is delayed. The program then blocks at this point, waiting for the delay to elapse. It then doesn’t need to ‘Wait’, because the task has already completed.

You don’t need to call ‘Wait’ at all. The ‘Result’ property will ‘Wait’ for you when you try to read it.

I think it’s generally assumed that reading a property isn’t an expensive operation, so this behaviour came as quite a surprise to me (thanks Rob Blackwell for pointing it out). I can understand the motivation for this behaviour, it makes code less buggy, but it strikes me as odd.

Advertisements