public MultiBandAsyncSync(int bands) { Bands = new AsyncSync[bands]; for (int i = 0; i < bands; i++) { Bands[i] = new AsyncSync(); } }
public async Task <int> RunAsync(int count = 1) // Assume that awaiting on this will take a long time { if (Executor == null) { TaskCompletionSource <Func <int, Task <int> > > exe = new TaskCompletionSource <Func <int, Task <int> > >(); AsyncOperationsTask = Task.Factory.StartNew(() => { int n = 0; AsyncSync sync = new AsyncSync(); AsyncWaiter flow_control = new AsyncWaiter(); TaskCompletionSource <int> result = new TaskCompletionSource <int>(); Task <int> execute(int number) { return(sync.ExecuteAsync(async() => { n = number; await flow_control.PulseAsync(true); try { number = await result.Task; } catch (Exception) { await Task.Yield(); result = new TaskCompletionSource <int>(); throw; } await Task.Yield(); result = new TaskCompletionSource <int>(); return number; })); } exe.SetResult(execute); while (n >= 0) { flow_control.Wait(); if (n > 0) { try { result.SetResult(Internal_Run(n)); } catch (Exception e) { result.SetException(e); } } else { result.SetResult(0); } } }, CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default); Interlocked.Exchange(ref Executor, await exe.Task)?.Invoke(-1); await Task.Yield(); } return(await Executor(count)); }