You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
namespace System.Threading.Tasks;
public class Task
{
+ public static IAsyncEnumerable<Task> WhenEach(params Task[] tasks);+ public static IAsyncEnumerable<Task> WhenEach(params ReadOnlySpan<Task> tasks); // params when possible+ public static IAsyncEnumerable<Task> WhenEach(IEnumerable<Task> tasks);+ public static IAsyncEnumerable<Task<TResult>> WhenEach(params Task<TResult>[] tasks); // params for now; move it to ReadOnlySpan overload when that syntax is possible+ public static IAsyncEnumerable<Task<TResult>> WhenEach(params ReadOnlySpan<Task<TResult>> tasks); // params when possible+ public static IAsyncEnumerable<Task<TResult>> WhenEach(IEnumerable<Task<TResult>> tasks);
}
// Using currently available APIsList<Task<int>>downloadTasks=downloadTasksQuery.ToList();while(downloadTasks.Any()){Task<int>finishedTask=awaitTask.WhenAny(downloadTasks);downloadTasks.Remove(finishedTask);Process(awaitfinishedTask);}
API Proposal
namespaceSystem.Threading.Tasks{publicclassTask:IAsyncResult,IDisposable{publicstaticIAsyncEnumerable<Task>WhenEach(paramsTask[]tasks);// Please change the name, if neededpublicstaticIAsyncEnumerable<Task>WhenEach(IEnumerable<Task>tasks);publicstaticIAsyncEnumerable<Task<TResult>>WhenEach(paramsTask<TResult>[]tasks);publicstaticIAsyncEnumerable<Task<TResult>>WhenEach(IEnumerable<Task<TResult>>tasks);}}
API Usage
// Using newly created APIsawaitforeach(varfinishedTaskinTask.WhenEach(downloadTasksQuery)){Process(awaitfinishedTask);}
EDITED on 1/23/2024 by @stephentoub:
namespace System.Threading.Tasks; public class Task { + public static IAsyncEnumerable<Task> WhenEach(params Task[] tasks); + public static IAsyncEnumerable<Task> WhenEach(params ReadOnlySpan<Task> tasks); // params when possible + public static IAsyncEnumerable<Task> WhenEach(IEnumerable<Task> tasks); + public static IAsyncEnumerable<Task<TResult>> WhenEach(params Task<TResult>[] tasks); // params for now; move it to ReadOnlySpan overload when that syntax is possible + public static IAsyncEnumerable<Task<TResult>> WhenEach(params ReadOnlySpan<Task<TResult>> tasks); // params when possible + public static IAsyncEnumerable<Task<TResult>> WhenEach(IEnumerable<Task<TResult>> tasks); }Background and motivation
Currently, if we need to "Process asynchronous tasks as they complete" then we need to write lots of unnecessary codes and its not straight forward, something like below.
API Proposal
API Usage
Alternative Designs
No response
Risks
No response
Updates
(Others can edit this section and add more info)
WhenEachname suggested by @theodorzoulias, [API Proposal]: Making "Process asynchronous tasks as they complete" easy by using IAsyncEnumerable #61959 (comment)