All Blog Posts
Dec 3, 2024
C# Advent: No one loves the .NET Core name anymore
Oct 10, 2024
Cancellation, Part 6: Linking
Aug 8, 2024
Cancellation, Part 5: Registration
Aug 1, 2024
ICYMI: Video Series on TCP/IP Application Protocol Design
Apr 25, 2024
MetaPost 2024-04-24
Dec 24, 2023
C# Advent: The Joy of Immutable Update Patterns
Nov 9, 2023
ConfigureAwait in .NET 8
Oct 5, 2023
Padding for Overlaid Structs
Sep 28, 2023
Memory-Mapped Files and Overlaid Structs
May 18, 2023
Grounded ChatGPT
Oct 13, 2022
Modern C# Techniques, Part 3: Generic Code Generation
Oct 6, 2022
Modern C# Techniques, Part 2: Value Records
Sep 29, 2022
Modern C# Techniques, Part 1: Curiously Recurring Generic Pattern
Mar 17, 2022
Cancellation, Part 4: Polling
Mar 10, 2022
Cancellation, Part 3: Detecting Cancellation
Mar 3, 2022
Cancellation, Part 2: Requesting Cancellation
Feb 24, 2022
Cancellation, Part 1: Overview
Feb 4, 2021
Asynchronous Messaging, Part 5: Miscellaneous Considerations
Jan 28, 2021
Asynchronous Messaging, Part 4: Retrieve Results
Jan 21, 2021
Asynchronous Messaging, Part 3: Backend Service
Jan 14, 2021
Asynchronous Messaging, Part 2: Durable Queues
Jan 7, 2021
Asynchronous Messaging, Part 1: Basic Distributed Architecture
Jun 18, 2020
Win32 Service Gotcha: Recovery Actions
Jun 11, 2020
A New Pattern for Exception Logging
Jun 4, 2020
BackgroundService Gotcha: Application Lifetime
May 28, 2020
BackgroundService Gotcha: Silent Failures
May 21, 2020
BackgroundService Gotcha: Startup
May 6, 2020
Using GitHub Actions for Pull Request Staging Environments, Part 4: Automated Deploy and Teardown
Apr 24, 2020
Using GitHub Actions for Pull Request Staging Environments, Part 3: Implementing Deploy and Teardown
Apr 9, 2020
Using GitHub Actions for Pull Request Staging Environments, Part 2: Slash Commands
Apr 2, 2020
Using GitHub Actions for Pull Request Staging Environments, Part 1: Introduction
Mar 28, 2020
ValueTask Restrictions
Jun 7, 2018
Microsoft.Extensions.Logging, Part 2: Types
May 31, 2018
Microsoft.Extensions.Logging, Part 1: Introduction
May 24, 2018
Docker as a Tool Provider
May 18, 2018
Using VSCode with PEGJS
May 10, 2018
Unit Testing with Roslyn
Apr 12, 2018
Slides Available: Code PaLOUsa 2018
Sep 12, 2017
Happy Birthday Async
Aug 31, 2017
Azure Functions SPA
Aug 25, 2017
Continuously Deploy Azure Functions from a GitHub Subfolder
Jul 14, 2017
Announcing AsyncTime
Jun 29, 2017
Happy birthday, iPhone!
Jun 22, 2017
Async JavaScript
Mar 30, 2017
ASP.NET Core SynchronizationContext
Dec 1, 2016
Eliding Async and Await
Nov 18, 2016
Azure Functions
Nov 11, 2016
Streaming Zip on ASP.NET Core
Nov 3, 2016
ZipArchive on Write-Only Streams
Oct 27, 2016
Historical Asynchronous PushStreamContent
Oct 20, 2016
Asynchronous PushStreamContent
Oct 13, 2016
Announcement: Speaking at Milwaukee .NET
Oct 6, 2016
Brazilian Portuguese translation of Async/Await
Jun 28, 2016
DotNet / NetCore Versions
May 17, 2016
React/Redux TodoMVC, Part 6: Refactoring
Apr 12, 2016
React/Redux TodoMVC, Part 5: Dispatching
Mar 8, 2016
React/Redux TodoMVC, Part 4: Debugging
Mar 1, 2016
React/Redux TodoMVC, Part 3: State
Feb 23, 2016
React/Redux TodoMVC, Part 2: Getting Started
Feb 17, 2016
React/Redux TodoMVC, Part 1: Language and Tooling
Feb 11, 2016
React/Redux TodoMVC, Part 0B: Why React? Why Redux?
Feb 10, 2016
React/Redux TodoMVC, Part 0: Introduction
Jan 21, 2016
DotNetApis Enters Beta
May 27, 2015
ThatConference 2015
May 1, 2015
MVP Virtual Conference
Apr 30, 2015
A Tour of Task, Part 10: Promise Tasks
Mar 28, 2015
Continuous Integration and Code Coverage for Open Source .NET CoreCLR Projects
Mar 21, 2015
GRDevDay 2015
Mar 5, 2015
Async Console Apps on .NET CoreCLR
Mar 3, 2015
A Tour of Task, Part 9: Delegate Tasks
Feb 5, 2015
A Tour of Task, Part 8: Starting
Jan 29, 2015
A Tour of Task, Part 7: Continuations
Jan 13, 2015
CodeMash 2015
Dec 5, 2014
A Tour of Task, Part 6: Results
Oct 10, 2014
A Tour of Task, Part 5: Waiting
Jun 14, 2014
Await in Catch and Finally
Jun 12, 2014
A Tour of Task, Part 4: Id
Jun 7, 2014
Fire and Forget on ASP.NET
Jun 5, 2014
A Tour of Task, Part 3: Status
May 29, 2014
A Tour of Task, Part 2: AsyncState and CreationOptions
May 15, 2014
A Tour of Task, Part 1: Constructors
May 5, 2014
Announcement: Concurrency in C# Early Release Ebook Available
May 1, 2014
Announcement: MSDN Article on Async Services
Apr 28, 2014
Announcement: Calculated Properties
Apr 24, 2014
A Tour of Task, Part 0: Overview
Apr 17, 2014
Announcement: Book
Apr 8, 2014
Announcement: MSDN "async MVVM" articles
Apr 7, 2014
Announcement: AspNetBackgroundTasks NuGet library
Apr 4, 2014
Announcement: GRDevDay 2014 slides available
Mar 13, 2014
A Cross-Domain Singleton
Feb 27, 2014
Guidelines for Lock-free Programming
Feb 20, 2014
Synchronous and Asynchronous Delegate Types
Jan 9, 2014
Achievement Unlocked: Speak at CodeMash
Jan 2, 2014
Announcement: Speaking at CodeMash 2014
Dec 12, 2013
Azure Cache Serialization (with JSON!)
Nov 21, 2013
There Is No Thread
Nov 14, 2013
Announcement: Nito.AsyncEx 2.0.0
Nov 11, 2013
Announcement: AsyncDiagnostics 1.0.1 Prerelease
Nov 8, 2013
Task.Run Etiquette Examples: Even in the Complex Case, Don't Use Task.Run in the Implementation
Nov 7, 2013
Task.Run Etiquette Examples: Don't Use Task.Run in the Implementation
Nov 6, 2013
Task.Run Etiquette Examples: Don't Use Task.Run for the Wrong Thing
Oct 17, 2013
Task.Run Etiquette and Proper Usage
Oct 10, 2013
Managed Services Roundup
Oct 3, 2013
ContinueWith is Dangerous, Too
Sep 26, 2013
Task.Run vs BackgroundWorker: Conclusion
Sep 19, 2013
Task.Run vs BackgroundWorker, Round 5: Reporting Progress
Sep 12, 2013
Task.Run vs BackgroundWorker, Round 4: Cancellation
Aug 29, 2013
StartNew is Dangerous
Aug 13, 2013
Slides Available: ThatConference 2013
Aug 1, 2013
Task.Run vs BackgroundWorker, Round 3: Returning Results
Jul 26, 2013
Task.Run vs BackgroundWorker, Round 2: Error Handling
May 17, 2013
Announcement: Async Diagnostics
May 16, 2013
Announcement: C# MVP
May 15, 2013
Announcement: AsyncEx Stable Release
May 14, 2013
Announcement: Speaking at ThatConference
May 13, 2013
Announcement: Over 200 Posts!
May 9, 2013
Task.Run vs BackgroundWorker, Round 1: The Basic Pattern
May 2, 2013
Task.Run vs BackgroundWorker: Intro
Apr 25, 2013
Recursive (Re-entrant) Locks
Apr 18, 2013
UI Guidelines for Async
Apr 11, 2013
CancellationToken Behavior with AsyncEx Coordination Primitives
Apr 4, 2013
Implicit Async Context ("AsyncLocal")
Mar 28, 2013
Task.CurrentId in Async Methods
Mar 21, 2013
A Few Words on Task.Id (and TaskScheduler.Id)
Mar 14, 2013
Async OOP 7: Design
Mar 7, 2013
Async OOP 6: Disposal
Mar 2, 2013
GRDevDay Slides and Code
Mar 1, 2013
MSDN Article and GRDevDay
Feb 28, 2013
Async OOP 5: Events
Jan 31, 2013
Async OOP 4: State
Jan 24, 2013
Async OOP 3: Properties
Jan 17, 2013
Async OOP 2: Constructors
Jan 10, 2013
Async OOP 1: Inheritance and Interfaces
Jan 3, 2013
Async OOP 0: Introduction
Dec 27, 2012
Async Producer-Consumer Queue 3: More Flexibility
Dec 20, 2012
Async Producer-Consumer Queue 2: More Portability
Dec 13, 2012
Returning Early from ASP.NET Requests
Dec 6, 2012
Don't Block in Asynchronous Code
Nov 15, 2012
Portable Class Library Enlightenment / Adaptation
Nov 8, 2012
Async Producer/Consumer Queue using Dataflow
Nov 8, 2012
And I'm Back!
Oct 4, 2012
Introduction to Dataflow, Part 3
Sep 27, 2012
Introduction to Dataflow, Part 2
Sep 20, 2012
Introduction to Dataflow, Part 1
Sep 12, 2012
An Async Horror Story
Sep 10, 2012
A New Web Site
Aug 30, 2012
Async Coroutines
Aug 23, 2012
Async and Scheduled Concurrency
Aug 16, 2012
Windows 8 Boot to Differencing VHD
Aug 16, 2012
Asynchronous Lazy Initialization
Aug 9, 2012
Async Doesn't Change the HTTP Protocol
Aug 2, 2012
Async WCF Today and Tomorrow
Jul 26, 2012
Async Interop with IAsyncResult
Jul 19, 2012
Thread is Dead
Jul 12, 2012
Don't Block on Async Code
Jun 21, 2012
ArraySegments Library Available
May 17, 2012
Framework Profiles in .NET
Feb 23, 2012
Thinking about Async Tasks
Feb 16, 2012
Reporting Progress from Async Tasks
Feb 9, 2012
Creating Tasks
Feb 7, 2012
Async Unit Tests, Part 2: The Right Way
Feb 6, 2012
Async Unit Tests, Part 1: The Wrong Way
Feb 3, 2012
Async Console Programs
Feb 2, 2012
Async and Await
Dec 1, 2011
Out for a Bit
Nov 26, 2011
Virtualizing Two Machines over Thanksgiving
Oct 13, 2011
Option Parsing: Case Sensitivity
Oct 6, 2011
Option Parsing: Positional Arguments
Sep 9, 2011
Nito.AsyncEx Available
Sep 1, 2011
The Async CTP "Why Do the Keywords Work THAT Way" Unofficial FAQ
Aug 25, 2011
Option Parsing: Validation
Aug 18, 2011
Option Parsing: Boolean Options
Aug 11, 2011
Option Parsing: Argument Parsing
Aug 4, 2011
Option Parsing: Preventing Multiple Argument Values
Jul 28, 2011
Option Parsing: Allowing Multiple Argument Values
Jul 21, 2011
System.Threading.Timer Constructor and Garbage Collection
Jul 14, 2011
Option Parsing: Options with Optional Arguments
Jul 7, 2011
Option Parsing: Default and Nullable Argument Values
Jun 30, 2011
Option Parsing: Option Names
Jun 23, 2011
Option Parsing: Error Handling
Jun 16, 2011
Option Parsing: Lexing
Jun 9, 2011
Option Parsing: The Option Parsing Pipeline
Jun 2, 2011
How to Run Processes Remotely
May 26, 2011
Getting the ObjectContext from an EntityObject
May 19, 2011
Signed and Unsigned Comparisons in C, C#, and T-SQL
May 12, 2011
Managed Services and UIs
May 5, 2011
Simple and Easy Entity Framework SQL Tracing
Apr 28, 2011
Unmanaged Blocking
Apr 26, 2011
NuGet No Longer Supports Code Contracts
Mar 28, 2011
Exception Types
Mar 24, 2011
The Border Case of Abs
Feb 20, 2011
SynchronizationContext Odds and Ends
Feb 11, 2011
Option Parsing: Introduction
Feb 3, 2011
NuGet Packages for Nito.KitchenSink
Feb 1, 2011
MSDN Article on SynchronizationContext Published
Jan 21, 2011
New Library: ConnectedProperties
Jan 19, 2011
Simple and Easy Code Contracts
Jan 14, 2011
Sharp Corner: Reference Types, Value Types, and Weirdos
Dec 30, 2010
Simple and Easy Tracing in .NET
Dec 24, 2010
On a Lighter Note: "Wii Me"?
Dec 21, 2010
ConditionalWeakTable
Nov 20, 2010
It's a Girl!
Nov 16, 2010
A Few Words on GUIDs
Oct 23, 2010
Grand Rapids Day of DotNET Slides Available
Oct 18, 2010
Implementing GCC's Builtin Functions
Oct 15, 2010
Firmware???
Sep 16, 2010
Using ILMerge with .NET 4.0 and/or Rx
Aug 16, 2010
Various Implementations of Asynchronous Background Tasks
Aug 5, 2010
Using Rx for Stream Encoding and Decoding
Aug 2, 2010
A Reminder about Asynchronous FileStreams
Jul 31, 2010
Asynchronous Contexts in Rx
Jul 16, 2010
ReSharper and the Obscure CTS Corner Case
Jun 25, 2010
On A Lighter Note: SocketFlags.MaxIOVectorLength
Jun 21, 2010
SQLite and Entity Framework 4
Jun 18, 2010
Reporting Progress from Tasks
Jun 2, 2010
TransactionScope Has a Default Timeout
May 1, 2010
Russian Translation of "Implementing IDisposable and Finalizers: 3 Simple Rules"
May 1, 2010
MS Bug: MvcBuildViews with One-Click Publish
Apr 30, 2010
Dynamically Binding to Static (Class-Scoped) Members
Apr 26, 2010
Innovations Are Great, but Content Is Necessary
Apr 23, 2010
Generic Methods with Dynamic Implementations
Apr 19, 2010
SVN Source Indexing to CodePlex
Apr 15, 2010
Declarative Programming Languages
Apr 13, 2010
VS2010 Without Web Deployment Projects
Apr 13, 2010
VS2010 WebDeploy and VS2010 Web Deployment Projects Beta 1
Apr 13, 2010
T4: Almost Complete
Apr 6, 2010
Sharp Corners: IList.IsReadOnly != IList.IsReadOnly
Mar 27, 2010
XmlDocs: Linking to the Overloads Page
Mar 27, 2010
XML Documentation: The Basics
Mar 20, 2010
Inheritance in General, and Deriving from HashAlgorithm in Particular
Mar 17, 2010
I/O Limitation in Windows
Mar 14, 2010
Sharp Corner: Value Types Are Never Reference-Equal
Mar 13, 2010
Introducing Sharp Corners
Feb 23, 2010
Crazy Saturday
Feb 17, 2010
Q&A: Should I Set Variables to Null to Assist Garbage Collection?
Feb 16, 2010
Interop: Multidimensional Arrays of Characters in a Structure
Feb 16, 2010
How to Implement IDisposable and Finalizers: Matrix and Flowchart
Feb 15, 2010
Evolution of Framework Design Guidelines?
Feb 15, 2010
ASP.NET Slides Available
Feb 6, 2010
Nito.Assimilation - the Assembly Manipulator
Feb 1, 2010
jQuery hosted on Google's CDN with IntelliSense
Feb 1, 2010
Cross-browser Silverlight
Jan 18, 2010
ASP.NET MVC Faking Web Services
Jan 5, 2010
Extension-Based Types
Jan 2, 2010
View of 2010
Jan 2, 2010
Best Computer Programming Book Ever
Dec 18, 2009
(Pre)Announcement of Nito.Linq!
Dec 3, 2009
Slides from nmNUG Available
Nov 28, 2009
Rx Release Brings Nice Surprises!
Nov 18, 2009
Unit Testing Without Design Suicide
Nov 18, 2009
Generic Generics and Method Overloads
Nov 17, 2009
ICollection.IsReadOnly (and Arrays)
Nov 16, 2009
Reverse Compiling Windows Forms
Oct 22, 2009
Windows Services and the Network
Oct 21, 2009
Managed Windows Services - The Basics
Oct 20, 2009
SynchronizationContext Properties Summary
Oct 7, 2009
DynamicExecute Now Official
Oct 1, 2009
Threading in the Business Layer
Sep 26, 2009
MCPD Achieved
Sep 22, 2009
Nito.Async 1.4 Released
Sep 22, 2009
Another SynchronizationContext Gotcha: InvokeRequired?
Sep 21, 2009
Minor Improvements for Language Design
Sep 18, 2009
If PusleEvent is broken, what about Monitor.Pulse?
Sep 16, 2009
IAsyncResult.AsyncWaitHandle and ThreadPool.RegisterWaitForSingleObject
Sep 14, 2009
Preventing Undesired Side-Effects in Enumerators
Sep 14, 2009
On a Lighter Note: Infinite Visual Studio Error
Sep 12, 2009
70-536 In the Bag
Sep 3, 2009
Notes from the Rx talk
Sep 1, 2009
Naming Unit Tests
Aug 28, 2009
Q&A: Is a call to GC.KeepAlive(this) required in Dispose?
Aug 28, 2009
Q&A: If Dispose calls SuppressFinalize, is KeepAlive required?
Aug 28, 2009
Q&A: Can GC.SuppressFinalize(this) be called at any time?
Aug 27, 2009
The Third Rule of Implementing IDisposable and Finalizers
Aug 27, 2009
The Second Rule of Implementing IDisposable and Finalizers
Aug 27, 2009
How to Implement IDisposable and Finalizers: 3 Easy Rules
Aug 27, 2009
The First Rule of Implementing IDisposable and Finalizers
Aug 27, 2009
Finalizers at Process Exit
Aug 20, 2009
Where Has Steve Been?
Aug 20, 2009
BarCampGR4 Slides Available
Aug 17, 2009
Alternative GUIDs for mobile devices using SQL Server Compact
Aug 14, 2009
Gotchas from SynchronizationContext!
Jul 28, 2009
SimplePropertyPath: A Poor Man's Binding
Jul 21, 2009
First CodeProject Article on Nito.MVVM
Jul 16, 2009
Interpreting NotifyCollectionChangedEventArgs
Jul 10, 2009
Nito.WeakReference and Nito.WeakCollection
Jul 1, 2009
XML over TCP/IP
Jun 30, 2009
Application Protocol Specifications
Jun 19, 2009
Threadsafe Events
Jun 13, 2009
Using Socket as a Connected Socket
Jun 12, 2009
MSBuild.ExtensionPack Accepts DynamicExecute Task
Jun 2, 2009
MSBuild: A Real-World Recursive Application
May 28, 2009
MSBuild: ItemGroup Metadata Inversion
May 28, 2009
MSBuild: Factorial!
May 27, 2009
Using Socket as a Server (Listening) Socket
May 27, 2009
MSBuild: Filtering an ItemGroup based on a Property
May 23, 2009
Using Socket as a Client Socket
May 23, 2009
On a Lighter Note: Airport Error
May 23, 2009
INI File Reader in C#
May 18, 2009
WiX Version Lying, Take Two
May 18, 2009
On a Lighter Note: Internet Explorer / MSDN Forums Error Message
May 18, 2009
Sample Code: Getting the Local IP Addresses
May 18, 2009
Getting the Local IP Address
May 16, 2009
On a Lighter Note: Interesting Message in AutoChk
May 16, 2009
Detection of Half-Open (Dropped) Connections
May 14, 2009
Error Handling
May 12, 2009
Dealing with WiX data files
May 5, 2009
Socket Operations
May 4, 2009
TCP/IP Resources
Apr 30, 2009
TCP/IP .NET Sockets FAQ
Apr 30, 2009
Sample code: Length-prefix message framing for streams
Apr 30, 2009
Message Framing
Apr 24, 2009
Asynchronous Callback Contexts
Jan 24, 2009
Announcing the release of Nito.Async
Sep 21, 2008
IDisposable article published
Sep 16, 2008
OpenSSL 0.9.8i Binaries
Jul 24, 2008
Interop documentation pointers
Jul 11, 2008
Software-only device drivers: What's in a name?
Jul 8, 2008
Soyo widescreen monitor inf available
Jul 3, 2008
Free IOCTL Decoder
Jun 20, 2008
Dynamically loading 32-bit or 64-bit code from a platform-agnostic executable