AwaitExtensions 1.0.0

dotnet add package AwaitExtensions --version 1.0.0
                    
NuGet\Install-Package AwaitExtensions -Version 1.0.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="AwaitExtensions" Version="1.0.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="AwaitExtensions" Version="1.0.0" />
                    
Directory.Packages.props
<PackageReference Include="AwaitExtensions" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add AwaitExtensions --version 1.0.0
                    
#r "nuget: AwaitExtensions, 1.0.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package AwaitExtensions@1.0.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=AwaitExtensions&version=1.0.0
                    
Install as a Cake Addin
#tool nuget:?package=AwaitExtensions&version=1.0.0
                    
Install as a Cake Tool

AwaitExtensions – Awaitable WaitHandle Support for .NET

This lightweight library adds await support for ordinary WaitHandle objects such as ManualResetEvent, AutoResetEvent, and others.

It exposes two simple extension methods:

  • GetAwaiter() — Enables await handle;
  • ToTask() — Converts a WaitHandle into a Task that completes when the handle is signaled

This makes it easy to integrate traditional wait-based APIs into modern async/await workflows.


✨ Features

  • Await any WaitHandle directly
  • Fully compatible with async/await patterns
  • Minimal, dependency-free implementation
  • Available as a NuGet package

📦 Installation

Add the NuGet package to your project:

dotnet add package AwaitExtensions

Or install via the NuGet Package Manager UI.


🚀 Usage

Awaiting a WaitHandle

var evt = new ManualResetEvent(false);

// Somewhere in your async method:
await evt;   // resumes when the event is signaled

Converting to a Task

var evt = new ManualResetEvent(false);
Task t = evt.ToTask();

await t;

Example

public async Task WaitForSignalAsync()
{
    using var evt = new ManualResetEvent(false);

    _ = Task.Run(() =>
    {
        Thread.Sleep(1000);
        evt.Set();
    });

    Console.WriteLine("Waiting...");
    await evt;
    Console.WriteLine("Signal received!");
}

🔧 How It Works

The implementation internally uses:

  • ThreadPool.RegisterWaitForSingleObject to react to the signal
  • TaskCompletionSource<object> to complete the returned task
  • A small lock to ensure safe initialization and unregistration

The result is a task that completes as soon as the handle is signaled.


🙏 Acknowledgements

The core implementation is based on a gist originally published by Andrew Arnott:
👉 https://gist.github.com/AArnott/1084951
Huge thanks to Andrew for sharing the elegant original version!

This package only wraps and redistributes the same idea for easier consumption.

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 is compatible.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • .NETFramework 4.8

    • No dependencies.
  • .NETStandard 2.0

    • No dependencies.
  • net10.0

    • No dependencies.
  • net8.0

    • No dependencies.
  • net9.0

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.0.0 488 11/13/2025

initial release