Async await...oh wait!
-
Upload
thomas-pierrain -
Category
Software
-
view
2.404 -
download
1
Transcript of Async await...oh wait!
ASYNC, AWAIT, OH… WAIT!YO U ’ D B E T T E R WATCH YO U R S T E PD e c e m b e r 2 0 1 6 – A l t . N e t P a r i s
@tpierrain (use case driven)
“USE CASE DRIVEN”, BUT ALSO…
• Reactive Programmer (> 10 years)
• eXtreme Programmer (> 10 years)
• Programmer (> 18 years)
@tpierrain
NFluent Value (DDD)
ASYNC-AWAIT INTENTION IS...
…TO EASILY TRANSFORM
SYNCHRONOUS CODE ASYNCHRONOUS CODE
(WITHOUT HURTING YOUR EXISTING CODE STRUCTURE)
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 ;-)
SYNCHRONOUS
• PERFORM
THIS IS ABOUT INVOCATION!(NOT ABOUT HOW THE GODDAMN THING IS EXECUTED)
ASYNCHRONOUS
• INITIATE
CONCURRENCY PARALLELISM
CONCURRENCY+
SIMULTANEOUS EXECUTION
• Multiple “threads” of execution
• Independent logical segments
CONCURRENCY
THIS IS ABOUT EXECUTION!(OF THE GODDAMN THING ;-)
PARALLELISM
CONCURRENCY+
SIMULTANEOUS EXECUTION
• Multiple “threads” of execution
• Independent logical segments
TASK PARALLEL LIBRARY REMINDER (TPL)
• 3 ways to instantiate and run a TASK:
• var task = Task.Run(lambda);
• var task = new Task(lambda).Start();
• Task.Factory.StartNew(lambda);
TASK PARALLEL LIBRARY REMINDER (TPL)
• 3 ways to instantiate and run a TASK:
• var task = Task.Run(lambda);
• var task = new Task(lambda).Start();
• Task.Factory.StartNew(lambda);
TASK PARALLEL LIBRARY REMINDER (TPL)
• 3 ways to instantiate and run a TASK:
• var task = Task.Run(lambda);
• var task = new Task(lambda).Start();
• Task.Factory.StartNew(lambda);
• task.Wait(), task.Result & task.Exception ( all blocking ;-(
TASK PARALLEL LIBRARY REMINDER (TPL)
• CONTINUATION
• A Task that will be achieve once a previous Task has finished
• var continuationTask = previousTask.ContinueWith(lambda);
PreviousTask
ContinuationTask
WINDOWS I/O: UNDER THE HOOD
User mode
Kernel modeCreate
I/O Request Packet (IRP)
(asynchronous)
THREAD
WINDOWS I/O: UNDER THE HOOD
User mode
Kernel mode
Create Asynchronous Procedure Call
(APC)to notify the UI
process (handle)
NO THREAD
WINDOWS I/O: UNDER THE HOOD
User mode
Kernel mode
Execute APC via I/O
Completion port (IOCP) thread
THREAD
WINDOWS I/O: UNDER THE HOOD
User mode
Kernel mode
Execute APC via I/O
Completion port (IOCP) thread
THREAD
WINDOWS I/O: UNDER THE HOOD
User mode
Kernel mode
Post the continuation for
UI thread execution
THREAD
YOU CODE A LIBRARY?
SYNCHRONIZATION CONTEXT IS NOT YOUR DECISION!
AVOID DEADLOCKS IMPROVE PERFORMANCE
USE CONFIGUREAWAIT(FALSE) EVERYWHERE!
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)
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)
MS GUIDELINES
• Use async void methods only for top-level event handlers (and their like)
• Use async Task-returning methods everywhere else
• Try-Catch your Async event handlers!
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
UNLESS YOU UNDERSTAND HOW IT WORKS
DON’T SYSTEMATIZE ASYNC-AWAIT?
NOTHING IN THE CONTINUATION?
NO NEED FOR AWAIT! (UNLESS FOR ‘USING’)
StateMachine
StateMachine
StateMachine
StateMachine
StateMachine
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
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 using Tasks (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