diff --git a/PolyShim/NetCore10/Task.cs b/PolyShim/NetCore10/Task.cs index 014014f..c23c87f 100644 --- a/PolyShim/NetCore10/Task.cs +++ b/PolyShim/NetCore10/Task.cs @@ -6,6 +6,10 @@ // ReSharper disable InconsistentNaming // ReSharper disable PartialTypeWithSinglePart +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; using System.Threading.Tasks; internal static partial class PolyfillExtensions @@ -26,6 +30,114 @@ internal static partial class PolyfillExtensions return tcs.Task; } + + // https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.run#system-threading-tasks-task-run(system-action-system-threading-cancellationtoken) + public static Task Run(Action action, CancellationToken cancellationToken) => + Task.Factory.StartNew( + action, + cancellationToken, + TaskCreationOptions.None, + TaskScheduler.Default + ); + + // https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.run#system-threading-tasks-task-run(system-action) + public static Task Run(Action action) => Task.Run(action, CancellationToken.None); + + // https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.run#system-threading-tasks-task-run(system-func((system-threading-tasks-task))-system-threading-cancellationtoken) + public static Task Run(Func function, CancellationToken cancellationToken) => + Task + .Factory.StartNew( + function, + cancellationToken, + TaskCreationOptions.None, + TaskScheduler.Default + ) + .Unwrap(); + + // https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.run#system-threading-tasks-task-run(system-func((system-threading-tasks-task))) + public static Task Run(Func function) => Task.Run(function, CancellationToken.None); + + // https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.run#system-threading-tasks-task-run-1(system-func((-0))-system-threading-cancellationtoken) + public static Task Run(Func function, CancellationToken cancellationToken) => + Task.Factory.StartNew( + function, + cancellationToken, + TaskCreationOptions.None, + TaskScheduler.Default + ); + + // https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.run#system-threading-tasks-task-run-1(system-func((-0))) + public static Task Run(Func function) => + Task.Run(function, CancellationToken.None); + + // https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.run#system-threading-tasks-task-run-1(system-func((system-threading-tasks-task((-0))))-system-threading-cancellationtoken) + public static Task Run(Func> function, CancellationToken cancellationToken) => + Task + .Factory.StartNew( + function, + cancellationToken, + TaskCreationOptions.None, + TaskScheduler.Default + ) + .Unwrap(); + + // https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.run#system-threading-tasks-task-run-1(system-func((system-threading-tasks-task((-0))))) + public static Task Run(Func> function) => + Task.Run(function, CancellationToken.None); + + // https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.whenall#system-threading-tasks-task-whenall(system-collections-generic-ienumerable((system-threading-tasks-task))) + public static Task WhenAll(IEnumerable tasks) => + Task.Factory.ContinueWhenAll( + tasks as Task[] ?? tasks.ToArray(), + _ => { }, + CancellationToken.None, + TaskContinuationOptions.OnlyOnRanToCompletion, + TaskScheduler.Default + ); + + // https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.whenall#system-threading-tasks-task-whenall(system-threading-tasks-task()) + public static Task WhenAll(params Task[] tasks) => WhenAll((IEnumerable)tasks); + + // https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.whenall#system-threading-tasks-task-whenall-1(system-collections-generic-ienumerable((system-threading-tasks-task((-0))))) + public static Task WhenAll(IEnumerable> tasks) => + Task.Factory.ContinueWhenAll( + tasks as Task[] ?? tasks.ToArray(), + completedTasks => completedTasks.Select(t => t.GetAwaiter().GetResult()).ToArray(), + CancellationToken.None, + TaskContinuationOptions.OnlyOnRanToCompletion, + TaskScheduler.Default + ); + + // https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.whenall#system-threading-tasks-task-whenall-1(system-threading-tasks-task((-0))()) + public static Task WhenAll(params Task[] tasks) => + WhenAll((IEnumerable>)tasks); + + // https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.whenany#system-threading-tasks-task-whenany(system-collections-generic-ienumerable((system-threading-tasks-task))) + public static Task WhenAny(IEnumerable tasks) => + Task.Factory.ContinueWhenAny( + tasks as Task[] ?? tasks.ToArray(), + t => t, + CancellationToken.None, + TaskContinuationOptions.None, + TaskScheduler.Default + ); + + // https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.whenany#system-threading-tasks-task-whenany(system-threading-tasks-task()) + public static Task WhenAny(params Task[] tasks) => WhenAny((IEnumerable)tasks); + + // https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.whenany#system-threading-tasks-task-whenany-1(system-collections-generic-ienumerable((system-threading-tasks-task((-0))))) + public static Task> WhenAny(IEnumerable> tasks) => + Task.Factory.ContinueWhenAny( + tasks as Task[] ?? tasks.ToArray(), + t => t, + CancellationToken.None, + TaskContinuationOptions.None, + TaskScheduler.Default + ); + + // https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.whenany#system-threading-tasks-task-whenany-1(system-threading-tasks-task((-0))()) + public static Task> WhenAny(params Task[] tasks) => + WhenAny((IEnumerable>)tasks); #endif } } diff --git a/PolyShim/Signatures.md b/PolyShim/Signatures.md index 0a47e23..42ef5d0 100644 --- a/PolyShim/Signatures.md +++ b/PolyShim/Signatures.md @@ -1,8 +1,8 @@ # Signatures -- **Total:** 275 +- **Total:** 291 - **Types:** 62 -- **Members:** 213 +- **Members:** 229 ___ @@ -335,10 +335,26 @@ ___ - [`IAsyncEnumerable WhenEach(IEnumerable)`](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.wheneach#system-threading-tasks-task-wheneach(system-collections-generic-ienumerable((system-threading-tasks-task)))) .NET 9.0 - [`IAsyncEnumerable WhenEach(params Task[])`](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.wheneach#system-threading-tasks-task-wheneach(system-threading-tasks-task())) .NET 9.0 - [`Task CompletedTask`](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.completedtask) .NET Core 1.0 + - [`Task Run(Action, CancellationToken)`](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.run#system-threading-tasks-task-run(system-action-system-threading-cancellationtoken)) .NET Core 1.0 + - [`Task Run(Action)`](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.run#system-threading-tasks-task-run(system-action)) .NET Core 1.0 + - [`Task Run(Func, CancellationToken)`](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.run#system-threading-tasks-task-run(system-func((system-threading-tasks-task))-system-threading-cancellationtoken)) .NET Core 1.0 + - [`Task Run(Func)`](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.run#system-threading-tasks-task-run(system-func((system-threading-tasks-task)))) .NET Core 1.0 - [`Task WaitAsync(CancellationToken)`](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.waitasync#system-threading-tasks-task-waitasync(system-threading-cancellationtoken)) .NET 6.0 - [`Task WaitAsync(TimeSpan, CancellationToken)`](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.waitasync#system-threading-tasks-task-waitasync(system-timespan-system-threading-cancellationtoken)) .NET 6.0 - [`Task WaitAsync(TimeSpan)`](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.waitasync#system-threading-tasks-task-waitasync(system-timespan)) .NET 6.0 + - [`Task WhenAll(IEnumerable)`](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.whenall#system-threading-tasks-task-whenall(system-collections-generic-ienumerable((system-threading-tasks-task)))) .NET Core 1.0 + - [`Task WhenAll(params Task[])`](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.whenall#system-threading-tasks-task-whenall(system-threading-tasks-task())) .NET Core 1.0 - [`Task FromResult(T?)`](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.fromresult) .NET Core 1.0 + - [`Task WhenAll(IEnumerable>)`](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.whenall#system-threading-tasks-task-whenall-1(system-collections-generic-ienumerable((system-threading-tasks-task((-0)))))) .NET Core 1.0 + - [`Task WhenAll(params Task[])`](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.whenall#system-threading-tasks-task-whenall-1(system-threading-tasks-task((-0))())) .NET Core 1.0 + - [`Task Run(Func, CancellationToken)`](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.run#system-threading-tasks-task-run-1(system-func((-0))-system-threading-cancellationtoken)) .NET Core 1.0 + - [`Task Run(Func)`](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.run#system-threading-tasks-task-run-1(system-func((-0)))) .NET Core 1.0 + - [`Task Run(Func>, CancellationToken)`](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.run#system-threading-tasks-task-run-1(system-func((system-threading-tasks-task((-0))))-system-threading-cancellationtoken)) .NET Core 1.0 + - [`Task Run(Func>)`](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.run#system-threading-tasks-task-run-1(system-func((system-threading-tasks-task((-0)))))) .NET Core 1.0 + - [`Task> WhenAny(IEnumerable>)`](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.whenany#system-threading-tasks-task-whenany-1(system-collections-generic-ienumerable((system-threading-tasks-task((-0)))))) .NET Core 1.0 + - [`Task> WhenAny(params Task[])`](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.whenany#system-threading-tasks-task-whenany-1(system-threading-tasks-task((-0))())) .NET Core 1.0 + - [`Task WhenAny(IEnumerable)`](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.whenany#system-threading-tasks-task-whenany(system-collections-generic-ienumerable((system-threading-tasks-task)))) .NET Core 1.0 + - [`Task WhenAny(params Task[])`](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task.whenany#system-threading-tasks-task-whenany(system-threading-tasks-task())) .NET Core 1.0 - `Task` - [`Task WaitAsync(CancellationToken)`](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task-1.waitasync#system-threading-tasks-task-1-waitasync(system-threading-cancellationtoken)) .NET 6.0 - [`Task WaitAsync(TimeSpan, CancellationToken)`](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task-1.waitasync#system-threading-tasks-task-1-waitasync(system-timespan-system-threading-cancellationtoken)) .NET 6.0