Get it now in the Unity Asset Store!

The Concurrency Kit is a .NET/Mono kit that includes a port of the Task Parallel Library and extends it to support Fibers, Coroutines, and Unity. Fibers allow code paths to execute concurrently using a single thread by leveraging the co-operative yielding behavior of coroutines.

// Start task 1 var t1 = Task.Factory.StartNew(() => PatHead()); // Start task 2 var t2 = Task.Factory.StartNew(() => RubTummy()); // This task will complete when t1 and t2 complete and // then it will continue by executing a happy dance. Task.WhenAll(t1, t2).ContinueWith(t3 => HappyDance()); 1 2 3 4 5 6 7 8 9 // Start task 1 var t1 = Task . Factory . StartNew ( ( ) = > PatHead ( ) ) ; // Start task 2 var t2 = Task . Factory . StartNew ( ( ) = > RubTummy ( ) ) ; // This task will complete when t1 and t2 complete and // then it will continue by executing a happy dance. Task . WhenAll ( t1 , t2 ) . ContinueWith ( t3 = > HappyDance ( ) ) ;

Because code written in this manner is designed with concurrency in mind, tasks can run in parallel across multiple threads or as concurrent fibers on a single thread by changing out the task scheduler. This flexibility makes it easy to write and maintain portable asynchronous code that scales.

Interoperability

Usability

Performance

Productivity Write more maintainable, more performant asynchronous code Use the .NET 4+ asynchronous task model in your designs – it’s feature rich and the framework standard going forward

public class HttpClient { public Task<HttpResponseMessage> GetAsync( string requestUri); public Task<HttpResponseMessage> PostAsync( string requestUri, HttpContent content); } 1 2 3 4 5 6 7 8 public class HttpClient { public Task < HttpResponseMessage > GetAsync ( string requestUri ) ; public Task < HttpResponseMessage > PostAsync ( string requestUri , HttpContent content ) ; } Start a background task using the thread pool and complete the operation on the main thread

Declaratively schedule workflows with chained asynchronous tasks and anonymous delegates

Task.Factory.StartNew(() => DoSomethingFromThreadPool()). ContinueWith(lastTask => DoSomethingFromMainThread(), mainThreadScheduler); 1 2 3 Task . Factory . StartNew ( ( ) = > DoSomethingFromThreadPool ( ) ) . ContinueWith ( lastTask = > DoSomethingFromMainThread ( ) , mainThreadScheduler ) ;

and Coordinate between concurrently executing tasks

Task.Factory.ContinueWhenAny(tasksToRun, winner => print("The winner is: " + winner)); 1 2 Task . Factory . ContinueWhenAny ( tasksToRun , winner = > print ( "The winner is: " + winner ) ) ;

between concurrently executing tasks Easily cancel tasks in progress

CancellationTokenSource tokenSource = new CancellationTokenSource(); void Start() { Task.Factory.StartNew(() => DoSomething(), tokenSource.Token); } void OnClick() { tokenSource.Cancel(); } 1 2 3 4 5 6 7 8 9 CancellationTokenSource tokenSource = new CancellationTokenSource ( ) ; void Start ( ) { Task . Factory . StartNew ( ( ) = > DoSomething ( ) , tokenSource . Token ) ; } void OnClick ( ) { tokenSource . Cancel ( ) ; } Leverage multiple CPU cores for maximum throughput

for maximum throughput Maximize individual thread usage with co-operative multitasking and task inlining

and task inlining Control how tasks are scheduled and the level of concurrency





See the API Reference for what is included or learn more about the Concurrency Kit.