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