TrimKit.EventBus 1.1.0

dotnet add package TrimKit.EventBus --version 1.1.0
                    
NuGet\Install-Package TrimKit.EventBus -Version 1.1.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="TrimKit.EventBus" Version="1.1.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="TrimKit.EventBus" Version="1.1.0" />
                    
Directory.Packages.props
<PackageReference Include="TrimKit.EventBus" />
                    
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 TrimKit.EventBus --version 1.1.0
                    
#r "nuget: TrimKit.EventBus, 1.1.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 TrimKit.EventBus@1.1.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=TrimKit.EventBus&version=1.1.0
                    
Install as a Cake Addin
#tool nuget:?package=TrimKit.EventBus&version=1.1.0
                    
Install as a Cake Tool

TrimKit.EventBus

A lightweight and mutation-safe event bus (event aggregator) for C# applications and games. Designed for simplicity and ease of use.

TrimKit.EventBus allows different parts of your system to communicate via strongly-typed events without hard dependencies or direct references.

Features

  • Lightweight & dependency-free.
  • Thread-safe.
  • Mutation-safe - handlers can safely modify subscriptions even during event publishing.
  • Disposable subscriptions - each Subscribe() returns an IDisposable token for easy unsubscribe.
  • SubscribeOnce() support - automatically unsubscribes after first event.
  • Duplicate protection - prevents duplicate handler registration.

Installation

Use provided nuget package or download the source.

NuGet

🔧 dotnet add package TrimKit.EventBus

Quick start

Define your events:

public sealed class GameStartedEvent
{
    public DateTime StartTime { get; }
    public GameStartedEvent(DateTime startTime) => StartTime = startTime;
}

public sealed class CharacterDamagedEvent
{
    public string Name { get; }
    public int Damage { get; }
    public CharacterDamagedEvent(string name, int damage)
    {
        Name = name;
        Damage = damage;
    }
}

Create the event bus itself:

var bus = new EventBus();

Add subscribers. You can subscribe normally or use SubscribeOnce() for a one-time handler.

// normal subscription
var token = bus.Subscribe<CharacterDamagedEvent>(e =>
{
    Console.WriteLine($"{e.Name} took {e.Damage} damage!");
});

// subscribe once
bus.SubscribeOnce<GameStartedEvent>(e =>
{
    Console.WriteLine($"[Once] Game started at {e.StartTime:T}");
});

Each Subscribe() returns an IDisposable token you can later call Dispose() on to unsubscribe:

token.Dispose();

And now you can start publishing events:

bus.Publish(new GameStartedEvent(DateTime.Now));
bus.Publish(new CharacterDamagedEvent("Goblin", 25));

Thread safety

All operations (Subscribe, Unsubscribe, Publish, Reset) are protected by a lock and safe for concurrent use. During event dispatch, handlers are called using a snapshot copy, so you can safely modify subscriptions while publishing.

Event dispatch rules

  • Dispatch is by exact event type - base or interface subscribers do not receive derived events.
  • Events can be any class or struct (no need for EventArgs).
  • Handlers are simple Action<T> delegates without a sender parameter. You can include the sender information inside the payload itself.

API Overview

Method Description
IDisposable Subscribe<T>(Action<T> handler) Subscribe to event T.
IDisposable SubscribeOnce<T>(Action<T> handler) Subscribe for one-time delivery.
bool Unsubscribe<T>(Action<T> handler) Remove specific subscription.
void Publish<T>(T payload) Publish event to all subscribers.
int GetSubscriberCount<T>() Get count of current subscribers for a type.
bool HasSubscribers<T>() Check if any subscribers exist.
void Clear<T>() Remove all subscriptions for a type T.
void ClearAll() Remove all subscriptions.

Changes

  • v1.1 - Switched to using Actions and expanded API.
  • v1.0.1 - Fixed namespaces.
  • v1.0 - Initial release.

TrimKit Collection

This library is part of the TrimKit collection - a set of small, focused C# libraries that make game development more enjoyable by reducing the need for boilerplate code and providing simple reusable building blocks that can be dropped into any project.

Each module is independent and can be used standalone or combined with others for a complete lightweight foundation.

Contribution

Contributions are welcome!

You can start with submitting an issue on GitHub.

License

This library is released under the MIT License.

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 was computed.  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 was computed.  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 was computed.  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 was computed.  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.
  • .NETStandard 2.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.1.0 192 10/29/2025
1.0.1 177 10/8/2025
1.0.0 176 10/8/2025