TrimKit.EventBus
1.0.0
See the version list below for details.
dotnet add package TrimKit.EventBus --version 1.0.0
NuGet\Install-Package TrimKit.EventBus -Version 1.0.0
<PackageReference Include="TrimKit.EventBus" Version="1.0.0" />
<PackageVersion Include="TrimKit.EventBus" Version="1.0.0" />
<PackageReference Include="TrimKit.EventBus" />
paket add TrimKit.EventBus --version 1.0.0
#r "nuget: TrimKit.EventBus, 1.0.0"
#:package TrimKit.EventBus@1.0.0
#addin nuget:?package=TrimKit.EventBus&version=1.0.0
#tool nuget:?package=TrimKit.EventBus&version=1.0.0
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.
🔧 dotnet add package TrimKit.EventBus
Quick start
Define your events, they must inherit from EventArgs:
public sealed class GameStartedEvent : EventArgs
{
public DateTime StartTime { get; }
public GameStartedEvent(DateTime startTime) => StartTime = startTime;
}
public sealed class CharacterDamagedEvent : EventArgs
{
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>((s, e) =>
{
Console.WriteLine($"{e.Name} took {e.Damage} damage!");
});
// subscribe once
bus.SubscribeOnce<GameStartedEvent>((s, 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(null, 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.
API Overview
| Method | Description |
|---|---|
IDisposable Subscribe<T>(EventHandler<T> handler) |
Subscribe to event T. |
IDisposable SubscribeOnce<T>(EventHandler<T> handler) |
Subscribe for one-time delivery. |
bool Unsubscribe<T>(EventHandler<T> handler) |
Remove specific subscription. |
void Publish<T>(object? sender, T eventArgs) |
Publish event to all subscribers. |
void Publish<T>(T eventArgs) |
Publish event to all subscribers. |
int GetSubscriberCount<T>() |
Get count of current subscribers for a type. |
void Reset() |
Remove all subscriptions. |
Changes
- v1.0 - Initial release.
Contribution
Contributions are welcome!
You can start with submitting an issue on GitHub.
License
Virtual File System is released under the MIT License.
| Product | Versions 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. |
-
.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.