41. SYNCHRONOUS
• PERFORM something here
and now.
• The caller thread will be
blocked until it’s done
ASYNCHRONOUS
• INITIATE something here and
now (off-loading).
• The caller thread is released
immediately
• Free for something else
• No waste of CPU resource ;-)
53. TASK PARALLEL LIBRARY REMINDER (TPL)
• 3 ways to instantiate and run aTASK:
• var task =Task.Run(lambda);
• var task = newTask(lambda).Start();
• Task.Factory.StartNew(lambda);
54. TASK PARALLEL LIBRARY REMINDER (TPL)
• 3 ways to instantiate and run aTASK:
• var task =Task.Run(lambda);
• var task = newTask(lambda).Start();
• Task.Factory.StartNew(lambda);
55. TASK PARALLEL LIBRARY REMINDER (TPL)
• 3 ways to instantiate and run aTASK:
• var task =Task.Run(lambda);
• var task = newTask(lambda).Start();
• Task.Factory.StartNew(lambda);
• task.Wait(), task.Result & task.Exception ( all blocking ;-(
56. TASK PARALLEL LIBRARY REMINDER (TPL)
• CONTINUATION
• ATask that will be achieve once a previousTask has finished
• var continuationTask = previousTask.ContinueWith(lambda);
PreviousTask
ContinuationTask
126. THE ASYNC VOID CASE
• Async void is a “fire-and-forget” mechanism...
• The caller is unable to know when an async void has finished
• The caller is unable to catch exceptions thrown from an async void
• (instead they get posted to the UI message-loop)
127. THE ASYNC VOID CASE
• Async void is a “fire-and-forget” mechanism...
• The caller is unable to know when an async void has finished
• The caller is unable to catch exceptions thrown from an async void
• (instead they get posted to the UI message-loop)
129. MS GUIDELINES
• Use async void methods only for top-level event handlers (and their like)
• Use asyncTask-returning methods everywhere else
• Try-Catch your Async event handlers!
134. WRAP-UP
1. Never block! Unless you want to deadlock
• Locks, Wait without timeout,Task.Result…
• Use top-level await when coding UI or Web
• Use ConfigureAwait(false) everywhere within your libraries
2. Never create « async void » methods
• And try catch all such existing event handlers
3. Only for I/Os
DON’T USE ASYNC-AWAIT
UNLESSYOU UNDERSTAND HOW ITWORKS
137. DON’T SYSTEMATIZE ASYNC-AWAIT?
NOTHING INTHE CONTINUATION?
NO NEED FOR AWAIT! (UNLESS FOR ‘USING’)
StateMachine
StateMachine
StateMachine
StateMachine
StateMachine
138. ASYNC METHOD GC IMPACT
• 3 allocations for every Async method
• Heap-allocated state machine
• With a field for every local variable in your method
• Completion delegate
• Task
140. FEW REFS
• Bart De Smet deep dive: https://channel9.msdn.com/Events/TechDays/Techdays-2014-the-
Netherlands/Async-programming-deep-dive
• Filip Ekberg at Oredev 2016: https://vimeo.com/191077931
• Async-Await Best practices: https://msdn.microsoft.com/en-us/magazine/jj991977.aspx
• Compiler error: http://stackoverflow.com/questions/12115168/why-does-this-async-await-
code-generate-not-all-code-paths-return-a-value
• Task.Run etiquette: http://blog.stephencleary.com/2013/11/taskrun-etiquette-examples-
dont-use.html
• There is no thread: http://blog.stephencleary.com/2013/11/there-is-no-thread.html
• Does usingTasks (TPL) library make an application multithreaded? :
http://stackoverflow.com/questions/23833255/does-using-tasks-tpl-library-make-an-
application-multithreaded
• Eliding Async-Await : http://blog.stephencleary.com/2016/12/eliding-async-await.html