To be a bit facetious: remember that an unhandled exception in your main program thread will also crash your program. The article holds a very valuable lesson, though: just because you don't see "Task" doesn't mean that there aren't threads involved. In this way `async void` is deceptive but is certainly not something that is broken or something that you should never use. There is actually a case where an exception i…
On a related note, I really dislike the dispatcher paradigm, especially with the inclusion of async-await. For good performance of IO async calls you usually want to call .ConfigureWait(false), otherwise it will wait for the UI context to switch back to, you might even risk thread starvation. But now each async call is a potential switch out of the UI thread and certain crasch down the road, meaning you have to put D…
It inherits it from Windows. As far as I know, most GUIs have a dispatcher because . I definitely think that there could have been a better way to solve the problem (method interception), however, I think that TPL does add value.
In your case you cited intense IO as one reason to call `.ConfigureAwait(false).` The thing is: you have made a conscious decision to not return to the UI thread and therefore are more likely to tread carefully when writing the remainder of the method. `.ConfigureAwait(false)` declares "dragons be here."
Previously someone who didn't know better would update the UI from the wrong thread, weird things happen and they don't know why.
Here's something to make things simpler for you: https://gist.github.com/jcdickinson/f875229e671710cf1b34