SlideShare a Scribd company logo
End-to-End Async and Await
Vince Fabro
Cardinal Solutions
Practice Manager, Enterprise App Dev
@vfabro
Agenda
• What is Async?
• Why bother?
• How does this work?
• Gotchas
• Best Practices & More Details
• Next Steps
Agenda
• What is Async?
• Why bother?
• How does this work?
• Gotchas
• Best Practices & More Details
• Next Steps
What is Async?
• C# 5.0 and .NET 4.5
• async and await keywords
• Asynchronous programming for the
masses!
What is Async?
• Asynchronous == Parallel?
• Asynchronous == Multithreaded?
• Asynchronous == Easy?
Agenda
• What is Async?
• Why bother?
• How does this work?
• Gotchas
• Best Practices & More Details
• Next Steps
Why bother?
• Improve app responsiveness
• Simplify asynchronous programming
 more approachable
Simpler /
More approachable than what?
Asynchrony the good old way
• [… as opposed to the much worse older ways]
• APM and EAP
• APM – Asynchronous Programming Model
– http://msdn.microsoft.com/en-us/library/ms228963%28v=vs.110%29.aspx
– http://msdn.microsoft.com/en-us/magazine/cc163467.aspx
• EAP – Event-based Asynchronous Pattern
– http://msdn.microsoft.com/en-us/library/wewwczdw%28v=vs.110%29.aspx
Asynchronous Programming Model
IAsyncResult result = Dns.BeginGetHostEntry(
args[0], null, null);
// Poll for completion information.
while (result.IsCompleted != true)
{
…
}
// EndGetHostByName blocks until complete.
IPHostEntry host = Dns.EndGetHostEntry(result);
string[] aliases = host.Aliases;
.NET2.0+
Event-based Asynchronous Pattern
private SoundPlayer player;
private void InitializeSound()
{
// Create an instance of the SoundPlayer class.
player = new SoundPlayer();
// Listen for the LoadCompleted event.
player.LoadCompleted +=
new AsyncCompletedEventHandler(player_LoadCompleted);
player.SoundLocation = filepathTextbox.Text;
player.Play();
}
private void player_LoadCompleted(
object sender, AsyncCompletedEventArgs e) { }
.NET2.0+
Supplanted by the TPL
• Both APM and EAP 
– “This pattern is no longer recommended for
new development”
• TPL  Task Parallel Library
– http://msdn.microsoft.com/en-
us/library/dd460693%28v=vs.110%29.aspx
.NET4.0+
Supplanted by the TPL
.NET4.0+
Supplanted by the TPL
.NET4.0+
Supplanted by the TPL
Parallel.ForEach(sourceCollection, item => Process(item));
Parallel.Invoke(() => DoSomeWork(), () => DoSomeOtherWork());
// Create a task and supply a user delegate
Task taskA = new Task( () =>
Console.WriteLine("Hello from taskA."));
// Start the task.
taskA.Start();
// Output a message from the calling thread.
Console.WriteLine("Hello from thread '{0}'.",
Thread.CurrentThread.Name);
taskA.Wait();
.NET4.0+
The New Hotness!
• TAP – Task-based Asynchronous Pattern
• async and await
• So… Why bother?
– Simpler than APM and EAP
– Simpler than raw TPL
Builds on the TPL
.NET4.5
Task-based Asynchronous Pattern
private async Task<int> AccessTheWebAsync()
{
HttpClient client = new HttpClient();
string urlContents = await client.GetStringAsync(
"http://msdn.microsoft.com");
return urlContents.Length;
}
Agenda
• What is Async?
• Why bother?
• How does this work?
• Gotchas
• Best Practices & More Details
• Next Steps
How does this work?
End to-end async and await
Task-based Asynchronous Pattern
private async Task<int> AccessTheWebAsync()
{
HttpClient client = new HttpClient();
string urlContents = await client.GetStringAsync(
"http://msdn.microsoft.com");
return urlContents.Length;
}
1. Before await
2. Await Task
3. Post await
2. “Awaitable”
3. Continuation
0. For compiler
How does this work?
Gimme the Code!
void IAsyncStateMachine.MoveNext()
{
string result = null;
try
{
int num = state;
//if (!Stop)
if (num != -3)
{
TaskAwaiter<string> taskAwaiter;
// Machine starts with num=-1 so we enter
if (num != 0)
{
// First (+ initial) state code, run code before await is invoked
httpClient = new HttpClient();
Debug.WriteLine("before await");
// A task is invoked
taskAwaiter = httpClient.GetStringAsync(url).GetAwaiter();
Gimme the Code!
Whole
Lotta
Code!
How does it work?
• Generates a state machine for every
async call
• SynchronizationContext
• Continuation Tasks
How does it work?
• SynchronizationContext
– Provides a way to queue a unit of work to a
context, not to a specific thread
– Keeps a queue and count of work to do
– Every thread has a current context
– http://msdn.microsoft.com/en-us/magazine/gg598924.aspx
How does it work?
• SynchronizationContext Implementations:
– WindowsFormsSynchronizationContext
– DispatcherSynchronizationContext
• WPF and SilverLight
– WinRTSynchronizationContext
– AspNetSynchronizationContext
• ASP.NET thread pool
– Default SynchronizationContext
• ThreadPool
How does it work?
• Continuation Tasks
– On completion of one task, invoke another
// The antecedent task. Can also be created with Task.Factory.StartNew.
Task<DayOfWeek> taskA = new Task<DayOfWeek>(() => DateTime.Today.DayOfWeek);
// The continuation. Its delegate takes the antecedent task
// as an argument and can return a different type.
Task<string> continuation = taskA.ContinueWith((antecedent) =>
{
return String.Format("Today is {0}.", antecedent.Result);
});
// Start the antecedent.
taskA.Start();
// Use the contuation's result.
Console.WriteLine(continuation.Result);
Task-based Asynchronous Pattern
private async Task<int> AccessTheWebAsync()
{
HttpClient client = new HttpClient();
string urlContents = await client.GetStringAsync(
"http://msdn.microsoft.com");
return urlContents.Length;
}
1. Before await
2. Await Task
3. Post await
2. “Awaitable”
3. Continuation
0. For compiler
Agenda
• What is Async?
• Why bother?
• How does this work?
• Gotchas
• Best Practices & More Details
• Next Steps
Gotchas…
• Requirements
– You must use the async keyword to await
– void events may need marked with async
public void Blah  public async Task BlahAsync
• Limitations
– You cannot declare ref or out parameters on
an async method
Gotchas…
• When you can’t await async methods
– Inside catch and finally blocks
– Inside properties
– Inside a lock block
– In an unsafe region
– Within most portions of a LINQ query
Gotchas…
• Deadlock and Race conditions, oh my!
var delayTask = DelayAsync();
delayTask.Wait();
Agenda
• What is Async?
• Why bother?
• How does this work?
• Gotchas
• Best Practices & More
Details
• Next Steps
Best Practices & More Details
• Name async methods BlahBlahAsync
• End to end
– Cascading Async
Best Practices & More Details
• Configuring ASP.NET
– Increase App Pool’s queue limit
– AsyncTimeout
• Async in ASP.NET page lifecycle events
%@Page ... Async=“true” %
RegisterAsyncTask(
new PageAsyncTask(GetDataAsync));
http://www.asp.net/mvc/tutorials/mvc-4/using-asynchronous-methods-in-aspnet-mvc-4
http://www.asp.net/web-forms/tutorials/aspnet-45/using-asynchronous-methods-in-aspnet-45
Best Practices & More Details
• Unit testing
– You can test async methods
[TestMethod]
public async Task GivenBlah…() {
var result = await testClass.DoSomethingAsync();
}
– You can mock async method calls
mockDownloadContent.Setup(x => x.DoSomethingAsync())
.Returns(Task.FromResult<string>(expectedResult));
Best Practices & More Details
• Entity Framework 6
– ApplicationDbContext
await context.Categories.Include(
c => c.Products).LoadAsync();
int savedCount =
await context.SaveChangesAsync();
– QueryableExtensions
var employeeCount = await query.CountAsync();
var firstEmployee = await query.FirstAsync();
https://entityframework.codeplex.com/wikipage?title=Task-based%20Asynchronous%20Pattern%20support%20in%20EF
Best Practices & More Details
• Executing tasks in parallel
await Task1Async();
await Task2Async();
await Task3Async();
await Task.WhenAll(Task1Async(),
Task2Async(),
Task3Async());
Best Practices & More Details
• Death by a thousand cuts
– Batch up async calls
• ConfigureAwait(false)
http://msdn.microsoft.com/en-us/magazine/hh456402.aspx
Best Practices & More Details
• await Task.Yield()
http://msdn.microsoft.com/en-us/library/hh873173%28v=vs.110%29.aspx
• Task cancellation
http://msdn.microsoft.com/en-us/library/jj155759.aspx
• Reporting progress
http://simonsdotnet.wordpress.com/2013/10/11/updating-your-ui-asynchronously-
part-3-reporting-progress/
Agenda
• What is Async?
• Why bother?
• How does this work?
• Gotchas
• Best Practices
• Next Steps
References
• Asynchronous Programming Patterns
– http://msdn.microsoft.com/en-us/library/wewwczdw%28v=vs.110%29.aspx
• Async and await FAQ
• Steven Cleary’s blog
• Channel 9
• Stephen Toub: The Costs of Async
– http://msdn.microsoft.com/en-us/magazine/hh456402.aspx
Thank You!

More Related Content

What's hot (20)

PDF
Asynchronous programming in .net 4.5 with c#
Binu Bhasuran
 
PPT
Asynchronous Programming in C# - Part 1
Mindfire Solutions
 
PPTX
Node.js - Advanced Basics
Doug Jones
 
PDF
Introduction to the New Asynchronous API in the .NET Driver
MongoDB
 
PPTX
Asynchronous Programming in ASP.NET
Chris Dufour
 
PDF
Async Await for Mobile Apps
Craig Dunn
 
PDF
Using Async in your Mobile Apps - Marek Safar
Xamarin
 
PDF
Async await...oh wait!
Thomas Pierrain
 
PPTX
Task parallel library presentation
ahmed sayed
 
PDF
Asynchronous job queues with python-rq
Ashish Acharya
 
PDF
Developer-friendly taskqueues: What you should ask yourself before choosing one
Sylvain Zimmer
 
PPTX
Gude for C++11 in Apache Traffic Server
Apache Traffic Server
 
PPTX
AMC Minor Technical Issues
Apache Traffic Server
 
PDF
Reactive programming with Rxjava
Christophe Marchal
 
PPTX
Intro to Functional Programming with RxJava
Mike Nakhimovich
 
PDF
Async/Await: TPL & Message Pumps
Particular Software
 
PDF
Async/Await Best Practices
Particular Software
 
PDF
Gatling @ Scala.Io 2013
slandelle
 
PPTX
Salesforce DUG - Queueable Apex
Akshay Varu
 
ODP
Using Grails to power your electric car
Marco Pas
 
Asynchronous programming in .net 4.5 with c#
Binu Bhasuran
 
Asynchronous Programming in C# - Part 1
Mindfire Solutions
 
Node.js - Advanced Basics
Doug Jones
 
Introduction to the New Asynchronous API in the .NET Driver
MongoDB
 
Asynchronous Programming in ASP.NET
Chris Dufour
 
Async Await for Mobile Apps
Craig Dunn
 
Using Async in your Mobile Apps - Marek Safar
Xamarin
 
Async await...oh wait!
Thomas Pierrain
 
Task parallel library presentation
ahmed sayed
 
Asynchronous job queues with python-rq
Ashish Acharya
 
Developer-friendly taskqueues: What you should ask yourself before choosing one
Sylvain Zimmer
 
Gude for C++11 in Apache Traffic Server
Apache Traffic Server
 
AMC Minor Technical Issues
Apache Traffic Server
 
Reactive programming with Rxjava
Christophe Marchal
 
Intro to Functional Programming with RxJava
Mike Nakhimovich
 
Async/Await: TPL & Message Pumps
Particular Software
 
Async/Await Best Practices
Particular Software
 
Gatling @ Scala.Io 2013
slandelle
 
Salesforce DUG - Queueable Apex
Akshay Varu
 
Using Grails to power your electric car
Marco Pas
 

Similar to End to-end async and await (20)

PPTX
Training – Going Async
Betclic Everest Group Tech Team
 
PPTX
Asynchronous programming in ASP.NET
Alex Thissen
 
PPTX
Parallel and Asynchronous Programming - ITProDevConnections 2012 (English)
Panagiotis Kanavos
 
PPTX
Async programming and python
Chetan Giridhar
 
PDF
Ratpack Web Framework
Daniel Woods
 
PPTX
Binary Studio Academy: Concurrency in C# 5.0
Binary Studio
 
PDF
Introduction to Apache Beam & No Shard Left Behind: APIs for Massive Parallel...
Dan Halperin
 
PPTX
introduction to node.js
orkaplan
 
PDF
Building Efficient and Reliable Crawler System With Sidekiq Enterprise
Gary Chu
 
PDF
Intro to CakePHP
Walther Lalk
 
PPTX
Ddd melbourne 2011 C# async ctp
Pratik Khasnabis
 
PDF
Basic Understanding and Implement of Node.js
Gary Yeh
 
PPTX
Async CTP 3 Presentation for MUGH 2012
Sri Kanth
 
PDF
Building Continuous Application with Structured Streaming and Real-Time Data ...
Databricks
 
PPTX
Advanced Web Technology.pptx
ssuser35fdf2
 
PDF
Apache Samza 1.0 - What's New, What's Next
Prateek Maheshwari
 
PPTX
History of asynchronous in .NET
Marcin Tyborowski
 
PDF
Writing Asynchronous Programs with Scala & Akka
Yardena Meymann
 
PDF
Angular - Improve Runtime performance 2019
Eliran Eliassy
 
PDF
[Struyf] Automate Your Tasks With Azure Functions
European Collaboration Summit
 
Training – Going Async
Betclic Everest Group Tech Team
 
Asynchronous programming in ASP.NET
Alex Thissen
 
Parallel and Asynchronous Programming - ITProDevConnections 2012 (English)
Panagiotis Kanavos
 
Async programming and python
Chetan Giridhar
 
Ratpack Web Framework
Daniel Woods
 
Binary Studio Academy: Concurrency in C# 5.0
Binary Studio
 
Introduction to Apache Beam & No Shard Left Behind: APIs for Massive Parallel...
Dan Halperin
 
introduction to node.js
orkaplan
 
Building Efficient and Reliable Crawler System With Sidekiq Enterprise
Gary Chu
 
Intro to CakePHP
Walther Lalk
 
Ddd melbourne 2011 C# async ctp
Pratik Khasnabis
 
Basic Understanding and Implement of Node.js
Gary Yeh
 
Async CTP 3 Presentation for MUGH 2012
Sri Kanth
 
Building Continuous Application with Structured Streaming and Real-Time Data ...
Databricks
 
Advanced Web Technology.pptx
ssuser35fdf2
 
Apache Samza 1.0 - What's New, What's Next
Prateek Maheshwari
 
History of asynchronous in .NET
Marcin Tyborowski
 
Writing Asynchronous Programs with Scala & Akka
Yardena Meymann
 
Angular - Improve Runtime performance 2019
Eliran Eliassy
 
[Struyf] Automate Your Tasks With Azure Functions
European Collaboration Summit
 
Ad

Recently uploaded (20)

PPTX
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
PDF
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
PDF
Empower Inclusion Through Accessible Java Applications
Ana-Maria Mihalceanu
 
PDF
CIFDAQ Weekly Market Wrap for 11th July 2025
CIFDAQ
 
PDF
CIFDAQ Market Wrap for the week of 4th July 2025
CIFDAQ
 
PDF
"AI Transformation: Directions and Challenges", Pavlo Shaternik
Fwdays
 
PDF
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
PDF
IoT-Powered Industrial Transformation – Smart Manufacturing to Connected Heal...
Rejig Digital
 
PPTX
Building Search Using OpenSearch: Limitations and Workarounds
Sease
 
PDF
Using FME to Develop Self-Service CAD Applications for a Major UK Police Force
Safe Software
 
PDF
Chris Elwell Woburn, MA - Passionate About IT Innovation
Chris Elwell Woburn, MA
 
PDF
HCIP-Data Center Facility Deployment V2.0 Training Material (Without Remarks ...
mcastillo49
 
PPTX
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
PDF
Presentation - Vibe Coding The Future of Tech
yanuarsinggih1
 
PDF
From Code to Challenge: Crafting Skill-Based Games That Engage and Reward
aiyshauae
 
PDF
Reverse Engineering of Security Products: Developing an Advanced Microsoft De...
nwbxhhcyjv
 
PDF
DevBcn - Building 10x Organizations Using Modern Productivity Metrics
Justin Reock
 
PDF
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
PDF
Smart Trailers 2025 Update with History and Overview
Paul Menig
 
PDF
July Patch Tuesday
Ivanti
 
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
Empower Inclusion Through Accessible Java Applications
Ana-Maria Mihalceanu
 
CIFDAQ Weekly Market Wrap for 11th July 2025
CIFDAQ
 
CIFDAQ Market Wrap for the week of 4th July 2025
CIFDAQ
 
"AI Transformation: Directions and Challenges", Pavlo Shaternik
Fwdays
 
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
IoT-Powered Industrial Transformation – Smart Manufacturing to Connected Heal...
Rejig Digital
 
Building Search Using OpenSearch: Limitations and Workarounds
Sease
 
Using FME to Develop Self-Service CAD Applications for a Major UK Police Force
Safe Software
 
Chris Elwell Woburn, MA - Passionate About IT Innovation
Chris Elwell Woburn, MA
 
HCIP-Data Center Facility Deployment V2.0 Training Material (Without Remarks ...
mcastillo49
 
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
Presentation - Vibe Coding The Future of Tech
yanuarsinggih1
 
From Code to Challenge: Crafting Skill-Based Games That Engage and Reward
aiyshauae
 
Reverse Engineering of Security Products: Developing an Advanced Microsoft De...
nwbxhhcyjv
 
DevBcn - Building 10x Organizations Using Modern Productivity Metrics
Justin Reock
 
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
Smart Trailers 2025 Update with History and Overview
Paul Menig
 
July Patch Tuesday
Ivanti
 
Ad

End to-end async and await

  • 1. End-to-End Async and Await Vince Fabro Cardinal Solutions Practice Manager, Enterprise App Dev @vfabro
  • 2. Agenda • What is Async? • Why bother? • How does this work? • Gotchas • Best Practices & More Details • Next Steps
  • 3. Agenda • What is Async? • Why bother? • How does this work? • Gotchas • Best Practices & More Details • Next Steps
  • 4. What is Async? • C# 5.0 and .NET 4.5 • async and await keywords • Asynchronous programming for the masses!
  • 5. What is Async? • Asynchronous == Parallel? • Asynchronous == Multithreaded? • Asynchronous == Easy?
  • 6. Agenda • What is Async? • Why bother? • How does this work? • Gotchas • Best Practices & More Details • Next Steps
  • 7. Why bother? • Improve app responsiveness • Simplify asynchronous programming  more approachable Simpler / More approachable than what?
  • 8. Asynchrony the good old way • [… as opposed to the much worse older ways] • APM and EAP • APM – Asynchronous Programming Model – http://msdn.microsoft.com/en-us/library/ms228963%28v=vs.110%29.aspx – http://msdn.microsoft.com/en-us/magazine/cc163467.aspx • EAP – Event-based Asynchronous Pattern – http://msdn.microsoft.com/en-us/library/wewwczdw%28v=vs.110%29.aspx
  • 9. Asynchronous Programming Model IAsyncResult result = Dns.BeginGetHostEntry( args[0], null, null); // Poll for completion information. while (result.IsCompleted != true) { … } // EndGetHostByName blocks until complete. IPHostEntry host = Dns.EndGetHostEntry(result); string[] aliases = host.Aliases; .NET2.0+
  • 10. Event-based Asynchronous Pattern private SoundPlayer player; private void InitializeSound() { // Create an instance of the SoundPlayer class. player = new SoundPlayer(); // Listen for the LoadCompleted event. player.LoadCompleted += new AsyncCompletedEventHandler(player_LoadCompleted); player.SoundLocation = filepathTextbox.Text; player.Play(); } private void player_LoadCompleted( object sender, AsyncCompletedEventArgs e) { } .NET2.0+
  • 11. Supplanted by the TPL • Both APM and EAP  – “This pattern is no longer recommended for new development” • TPL  Task Parallel Library – http://msdn.microsoft.com/en- us/library/dd460693%28v=vs.110%29.aspx .NET4.0+
  • 12. Supplanted by the TPL .NET4.0+
  • 13. Supplanted by the TPL .NET4.0+
  • 14. Supplanted by the TPL Parallel.ForEach(sourceCollection, item => Process(item)); Parallel.Invoke(() => DoSomeWork(), () => DoSomeOtherWork()); // Create a task and supply a user delegate Task taskA = new Task( () => Console.WriteLine("Hello from taskA.")); // Start the task. taskA.Start(); // Output a message from the calling thread. Console.WriteLine("Hello from thread '{0}'.", Thread.CurrentThread.Name); taskA.Wait(); .NET4.0+
  • 15. The New Hotness! • TAP – Task-based Asynchronous Pattern • async and await • So… Why bother? – Simpler than APM and EAP – Simpler than raw TPL Builds on the TPL .NET4.5
  • 16. Task-based Asynchronous Pattern private async Task<int> AccessTheWebAsync() { HttpClient client = new HttpClient(); string urlContents = await client.GetStringAsync( "http://msdn.microsoft.com"); return urlContents.Length; }
  • 17. Agenda • What is Async? • Why bother? • How does this work? • Gotchas • Best Practices & More Details • Next Steps
  • 18. How does this work?
  • 20. Task-based Asynchronous Pattern private async Task<int> AccessTheWebAsync() { HttpClient client = new HttpClient(); string urlContents = await client.GetStringAsync( "http://msdn.microsoft.com"); return urlContents.Length; } 1. Before await 2. Await Task 3. Post await 2. “Awaitable” 3. Continuation 0. For compiler
  • 21. How does this work?
  • 22. Gimme the Code! void IAsyncStateMachine.MoveNext() { string result = null; try { int num = state; //if (!Stop) if (num != -3) { TaskAwaiter<string> taskAwaiter; // Machine starts with num=-1 so we enter if (num != 0) { // First (+ initial) state code, run code before await is invoked httpClient = new HttpClient(); Debug.WriteLine("before await"); // A task is invoked taskAwaiter = httpClient.GetStringAsync(url).GetAwaiter();
  • 24. How does it work? • Generates a state machine for every async call • SynchronizationContext • Continuation Tasks
  • 25. How does it work? • SynchronizationContext – Provides a way to queue a unit of work to a context, not to a specific thread – Keeps a queue and count of work to do – Every thread has a current context – http://msdn.microsoft.com/en-us/magazine/gg598924.aspx
  • 26. How does it work? • SynchronizationContext Implementations: – WindowsFormsSynchronizationContext – DispatcherSynchronizationContext • WPF and SilverLight – WinRTSynchronizationContext – AspNetSynchronizationContext • ASP.NET thread pool – Default SynchronizationContext • ThreadPool
  • 27. How does it work? • Continuation Tasks – On completion of one task, invoke another // The antecedent task. Can also be created with Task.Factory.StartNew. Task<DayOfWeek> taskA = new Task<DayOfWeek>(() => DateTime.Today.DayOfWeek); // The continuation. Its delegate takes the antecedent task // as an argument and can return a different type. Task<string> continuation = taskA.ContinueWith((antecedent) => { return String.Format("Today is {0}.", antecedent.Result); }); // Start the antecedent. taskA.Start(); // Use the contuation's result. Console.WriteLine(continuation.Result);
  • 28. Task-based Asynchronous Pattern private async Task<int> AccessTheWebAsync() { HttpClient client = new HttpClient(); string urlContents = await client.GetStringAsync( "http://msdn.microsoft.com"); return urlContents.Length; } 1. Before await 2. Await Task 3. Post await 2. “Awaitable” 3. Continuation 0. For compiler
  • 29. Agenda • What is Async? • Why bother? • How does this work? • Gotchas • Best Practices & More Details • Next Steps
  • 30. Gotchas… • Requirements – You must use the async keyword to await – void events may need marked with async public void Blah  public async Task BlahAsync • Limitations – You cannot declare ref or out parameters on an async method
  • 31. Gotchas… • When you can’t await async methods – Inside catch and finally blocks – Inside properties – Inside a lock block – In an unsafe region – Within most portions of a LINQ query
  • 32. Gotchas… • Deadlock and Race conditions, oh my! var delayTask = DelayAsync(); delayTask.Wait();
  • 33. Agenda • What is Async? • Why bother? • How does this work? • Gotchas • Best Practices & More Details • Next Steps
  • 34. Best Practices & More Details • Name async methods BlahBlahAsync • End to end – Cascading Async
  • 35. Best Practices & More Details • Configuring ASP.NET – Increase App Pool’s queue limit – AsyncTimeout • Async in ASP.NET page lifecycle events %@Page ... Async=“true” % RegisterAsyncTask( new PageAsyncTask(GetDataAsync)); http://www.asp.net/mvc/tutorials/mvc-4/using-asynchronous-methods-in-aspnet-mvc-4 http://www.asp.net/web-forms/tutorials/aspnet-45/using-asynchronous-methods-in-aspnet-45
  • 36. Best Practices & More Details • Unit testing – You can test async methods [TestMethod] public async Task GivenBlah…() { var result = await testClass.DoSomethingAsync(); } – You can mock async method calls mockDownloadContent.Setup(x => x.DoSomethingAsync()) .Returns(Task.FromResult<string>(expectedResult));
  • 37. Best Practices & More Details • Entity Framework 6 – ApplicationDbContext await context.Categories.Include( c => c.Products).LoadAsync(); int savedCount = await context.SaveChangesAsync(); – QueryableExtensions var employeeCount = await query.CountAsync(); var firstEmployee = await query.FirstAsync(); https://entityframework.codeplex.com/wikipage?title=Task-based%20Asynchronous%20Pattern%20support%20in%20EF
  • 38. Best Practices & More Details • Executing tasks in parallel await Task1Async(); await Task2Async(); await Task3Async(); await Task.WhenAll(Task1Async(), Task2Async(), Task3Async());
  • 39. Best Practices & More Details • Death by a thousand cuts – Batch up async calls • ConfigureAwait(false) http://msdn.microsoft.com/en-us/magazine/hh456402.aspx
  • 40. Best Practices & More Details • await Task.Yield() http://msdn.microsoft.com/en-us/library/hh873173%28v=vs.110%29.aspx • Task cancellation http://msdn.microsoft.com/en-us/library/jj155759.aspx • Reporting progress http://simonsdotnet.wordpress.com/2013/10/11/updating-your-ui-asynchronously- part-3-reporting-progress/
  • 41. Agenda • What is Async? • Why bother? • How does this work? • Gotchas • Best Practices • Next Steps
  • 42. References • Asynchronous Programming Patterns – http://msdn.microsoft.com/en-us/library/wewwczdw%28v=vs.110%29.aspx • Async and await FAQ • Steven Cleary’s blog • Channel 9 • Stephen Toub: The Costs of Async – http://msdn.microsoft.com/en-us/magazine/hh456402.aspx

Editor's Notes

  • #3: Have been in Tampa for almost 2 months. Excited to be here and looking forward to engaging with the community. We have built very strong successful relationships with many Fortune 1000/500/1 clients in our other cities.
  • #4: Here is a quick snapshot of some of those companies. The majority, if not all of these clients are ongoing/established relationships…not a one and done.
  • #5: Involving our UX team in our technology discussions is crucial. Building an application with the user in mind is important but so is designing for the technology. Our UX team understands the technology, whether it be mobile, web dev, SharePoint, etc. which has allowed us to become a go-to UX shop for many of the clients I mentioned. More recently our UX is engaging on most of our BI projects as self-service becomes important, users need to be able to find and manipulate their data quickly and easily.
  • #6: My intention is an end-to-end, breadth first approach, although perhaps not very deep in some areas
  • #8: Need a dashboard for customer account viewBuild presentations for customers for design and cost analysisProcessDeliverables
  • #9: Need a dashboard for customer account viewBuild presentations for customers for design and cost analysisProcessDeliverables