Robust and efficient library for management of asynchronous operations.
- Allocation-free async operations
- Cancelable operations with custom allocation-free CancelationToken/Source
- Allocation-free async iterators with async Linq
- Progress with enforced normalization
- Structured concurrency
- async/await support and .Then API
- Thread safe
- Easily switch to foreground or background context
- Circular await detection
- Full causality traces
- Interoperable with Tasks and Unity's Coroutines/Awaitables
- CLS compliant
ProtoPromise conforms to the Promises/A Spec as far as is possible with C# (using static typing instead of dynamic), and further extends it to support Cancelations and Progress.
This library was built to work in all C#/.Net ecosystems, including Unity, Mono, .Net Framework, .Net Core, and AOT compilation. It is CLS compliant, so it is not restricted to only C#, and will work with any .Net language.
- ProtoPromise v3 supports .Net Standard 2.0 or newer (Unity 2018.3 or newer).
- ProtoPromise v2 supports .Net 3.5 or newer (Unity 5.5 or newer).
See Guides for information on how to install and use this library.
Compare performance to other async libraries:
Type | Pending | Mean | Allocated | Survived |
---|---|---|---|---|
ProtoPromise | False | 172.6 ns | - | - |
Task | False | 260.9 ns | 192 B | - |
UniTask | False | 306.8 ns | - | - |
UnityFxAsync | False | 368.6 ns | 360 B | - |
ValueTask | False | 337.4 ns | - | - |
ProtoPromise | True | 1,402.3 ns | - | 648 B |
Task | True | 2,110.8 ns | 1120 B | - |
UniTask | True | 1,817.7 ns | - | 744 B |
UnityFxAsync | True | 1,998.2 ns | 1952 B | - |
ValueTask | True | 2,486.9 ns | 968 B | 40 B |
See the C# Asynchronous Benchmarks Repo for a full performance comparison.
- Fixed a race condition with
Promise.AsValueTask()
.
See ChangeLog for the full changelog.
This library was inspired by ES6 Promises, RSG Promises, uPromise, TPL, UniTask, AsyncEx, and UnityAsync.