.NET Parallel Programming

All about Async/Await, System.Threading.Tasks, System.Collections.Concurrent, System.Linq, and more…

Building Async Coordination Primitives, Part 2: AsyncAutoResetEvent
Building Async Coordination Primitives, Part 2: AsyncAutoResetEvent
In my last post, I discussed building an asynchronous version of a manual-reset event.  This time, we’ll build an asynchronous version of an auto-reset event.A manual-reset event is transitioned to the signaled state when requested to do so (i.e. calling Set()), and then it remains in that state until it’s manually ...
Building Async Coordination Primitives, Part 1: AsyncManualResetEvent
Building Async Coordination Primitives, Part 1: AsyncManualResetEvent
The Task-based Async Pattern (TAP) isn’t just about asynchronous operations that you initiate and then asynchronously wait for to complete.  More generally, tasks can be used to represent all sorts of happenings, enabling you to await for any matter of condition to occur.  We can even use Tasks to build simple coordination ...
Potential pitfalls to avoid when passing around async lambdas
Potential pitfalls to avoid when passing around async lambdas
One of the really useful capabilities of the new async methods feature in C# and Visual Basic is the ability to write async lambdas and anonymous methods (from here on in this post, I’ll refer to both of these as async lambdas, since the discussion applies equally to both).  This allows you to easily get a delegate to represent an ...
Building a custom GetOrAdd method for ConcurrentDictionary
Building a custom GetOrAdd method for ConcurrentDictionary
I was recently asked by a developer about getting some additional information out of ConcurrentDictionary<TKey,TValue>’s GetOrAdd method.  As a reminder, GetOrAdd either returns the value for a key currently in the dictionary, or if that key doesn’t have a value, it adds a value for the key as dictated by either a TValue...
Know Thine Implicit Allocations
Know Thine Implicit Allocations
For .NET 4.5, we’ve invested quite a bit of effort into performance, and in particular for the Task Parallel Library (Joe Hoag wrote a good paper covering some of these improvements).  We focused such effort on TPL because it is a core component used in async programming and at a foundational level for many libraries and ...
Advanced APM Consumption in Async Methods
Advanced APM Consumption in Async Methods
I’ve previously blogged about how to expose existing Asynchronous Programming Model (APM) implementations as Task-based methods.  This can be done manually using a TaskCompletionSource<TResult>, or it can be done using the built-in wrapper provided in TPL via the Task.Factory.FromAsync method.  By creating a Task-based ...
Await, SynchronizationContext, and Console Apps: Part 2
Await, SynchronizationContext, and Console Apps: Part 2
Yesterday, I blogged about how you can implement a custom SynchronizationContext in order to pump the continuations used by async methods so that they may be processed on a single, dedicated thread.  I also highlighted that this is basically what UI frameworks like Windows Forms and Windows Presentation Foundation do with their message ...