Skip to content

Robust and efficient library for management of asynchronous operations in C#/.Net.

License

Notifications You must be signed in to change notification settings

timcassell/ProtoPromise

Repository files navigation

ProtoPromise

Promises/A  logo

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.

Latest Updates

v3.1.1 - August 16, 2024

  • Fixed a race condition with Promise.AsValueTask().

See ChangeLog for the full changelog.

Acknowledgements

This library was inspired by ES6 Promises, RSG Promises, uPromise, TPL, UniTask, AsyncEx, and UnityAsync.