Fiber.WhenAll.cs
Go to the documentation of this file.
1 using System;
2 using System.Collections;
3 using System.Threading;
5 using System.Linq;
7 
8 namespace SpicyPixel.Threading
9 {
10  public partial class Fiber
11  {
21  public static Fiber WhenAll (params Fiber [] fibers)
22  {
23  return WhenAll (fibers, Timeout.Infinite, CancellationToken.None);
24  }
25 
36  public static Fiber WhenAll (Fiber [] fibers, CancellationToken cancellationToken)
37  {
38  return WhenAll (fibers, Timeout.Infinite, cancellationToken);
39  }
40 
51  public static Fiber WhenAll (Fiber [] fibers, TimeSpan timeout)
52  {
53  return WhenAll (fibers, CheckTimeout (timeout), CancellationToken.None);
54  }
55 
66  public static Fiber WhenAll (Fiber [] fibers, int millisecondsTimeout)
67  {
68  return WhenAll (fibers, millisecondsTimeout, CancellationToken.None);
69  }
70 
82  public static Fiber WhenAll (Fiber [] fibers, int millisecondsTimeout, CancellationToken cancellationToken)
83  {
84  return WhenAll (fibers, millisecondsTimeout, cancellationToken, FiberScheduler.Current);
85  }
86 
99  public static Fiber WhenAll (Fiber [] fibers, int millisecondsTimeout, CancellationToken cancellationToken, FiberScheduler scheduler)
100  {
101  if (fibers == null)
102  throw new ArgumentNullException ("fibers");
103 
104  foreach (var fiber in fibers) {
105  if (fiber == null)
106  throw new ArgumentException ("fibers", "the fibers argument contains a null element");
107  }
108 
109  return Fiber.Factory.StartNew (WhenAllFibersCoroutine (fibers, millisecondsTimeout, cancellationToken), cancellationToken, scheduler);
110  }
111 
124  public static Fiber WhenAll (IEnumerable<Fiber> fibers, int millisecondsTimeout, CancellationToken cancellationToken, FiberScheduler scheduler)
125  {
126  return WhenAll (fibers.ToArray (), millisecondsTimeout, cancellationToken, scheduler);
127  }
128 
129  static IEnumerator WhenAllFibersCoroutine (IEnumerable<Fiber> fibers, int millisecondsTimeout, CancellationToken cancellationToken)
130  {
131  var startWait = DateTime.Now;
132  while (true) {
133  if ((millisecondsTimeout != Timeout.Infinite
134  && (DateTime.Now - startWait).TotalMilliseconds >= millisecondsTimeout)) {
135  throw new TimeoutException ();
136  }
137 
138  cancellationToken.ThrowIfCancellationRequested ();
139 
140  if (fibers.All (f => f.IsCompleted)) {
141  if (fibers.Any (f => f.IsCanceled)) {
143  }
144  if (fibers.Any (f => f.IsFaulted)) {
145  throw new AggregateException (
146  fibers.Where (f => f.IsFaulted).Select (f => f.Exception));
147  }
148  yield break;
149  }
150 
151  yield return FiberInstruction.YieldToAnyFiber;
152  }
153  }
154 
164  public static Fiber WhenAll (params Task [] tasks)
165  {
166  return WhenAll (tasks, Timeout.Infinite, CancellationToken.None);
167  }
168 
179  public static Fiber WhenAll (Task [] tasks, CancellationToken cancellationToken)
180  {
181  return WhenAll (tasks, Timeout.Infinite, cancellationToken);
182  }
183 
194  public static Fiber WhenAll (Task [] tasks, TimeSpan timeout)
195  {
196  return WhenAll (tasks, CheckTimeout (timeout), CancellationToken.None);
197  }
198 
209  public static Fiber WhenAll (Task [] tasks, int millisecondsTimeout)
210  {
211  return WhenAll (tasks, millisecondsTimeout, CancellationToken.None);
212  }
213 
225  public static Fiber WhenAll (Task [] tasks, int millisecondsTimeout, CancellationToken cancellationToken)
226  {
227  return WhenAll (tasks, millisecondsTimeout, cancellationToken, FiberScheduler.Current);
228  }
229 
242  public static Fiber WhenAll (Task [] tasks, int millisecondsTimeout, CancellationToken cancellationToken, FiberScheduler scheduler)
243  {
244  if (tasks == null)
245  throw new ArgumentNullException ("tasks");
246 
247  foreach (var fiber in tasks) {
248  if (fiber == null)
249  throw new ArgumentException ("tasks", "the tasks argument contains a null element");
250  }
251 
252  return Fiber.Factory.StartNew (WhenAllTasksCoroutine (tasks, millisecondsTimeout, cancellationToken), cancellationToken, scheduler);
253  }
254 
267  public static Fiber WhenAll (IEnumerable<Task> tasks, int millisecondsTimeout, CancellationToken cancellationToken, FiberScheduler scheduler)
268  {
269  return WhenAll (tasks.ToArray (), millisecondsTimeout, cancellationToken, scheduler);
270  }
271 
272  static IEnumerator WhenAllTasksCoroutine (IEnumerable<Task> tasks, int millisecondsTimeout, CancellationToken cancellationToken)
273  {
274  var startWait = DateTime.Now;
275  while (true) {
276  if ((millisecondsTimeout != Timeout.Infinite
277  && (DateTime.Now - startWait).TotalMilliseconds >= millisecondsTimeout)) {
278  throw new TimeoutException ();
279  }
280 
281  cancellationToken.ThrowIfCancellationRequested ();
282 
283  if (tasks.All (t => t.IsCompleted)) {
284  if (tasks.Any (t => t.IsCanceled)) {
286  }
287  if (tasks.Any (t => t.IsFaulted)) {
288  throw new AggregateException (
289  tasks.Where (t => t.IsFaulted).SelectMany (t => t.Exception.InnerExceptions));
290  }
291  yield break;
292  }
293 
294  yield return FiberInstruction.YieldToAnyFiber;
295  }
296  }
297  }
298 }
299 
Schedules fibers for execution.
Fiber StartNew(IEnumerator coroutine)
Start executing a new fiber using the default scheduler on the thread.
static FiberFactory Factory
Gets the default factory for creating fibers.
Definition: Fiber.cs:119
static Fiber WhenAll(Fiber [] fibers, int millisecondsTimeout, CancellationToken cancellationToken)
Returns a fiber that waits on all fibers to complete.
A Fiber is a lightweight means of scheduling work that enables multiple units of processing to execut...
static Fiber WhenAll(Fiber [] fibers, int millisecondsTimeout)
Returns a fiber that waits on all fibers to complete.
static Fiber WhenAll(Task [] tasks, CancellationToken cancellationToken)
Returns a fiber that waits on all tasks to complete.
static Fiber WhenAll(Task [] tasks, int millisecondsTimeout, CancellationToken cancellationToken, FiberScheduler scheduler)
Returns a fiber that waits on all tasks to complete.
static Fiber WhenAll(Fiber [] fibers, int millisecondsTimeout, CancellationToken cancellationToken, FiberScheduler scheduler)
Returns a fiber that waits on all fibers to complete.
static Fiber WhenAll(Task [] tasks, TimeSpan timeout)
Returns a fiber that waits on all tasks to complete.
static FiberScheduler Current
Gets the default fiber scheduler for the thread.
static Fiber WhenAll(Task [] tasks, int millisecondsTimeout, CancellationToken cancellationToken)
Returns a fiber that waits on all tasks to complete.
static Fiber WhenAll(params Task [] tasks)
Returns a fiber that waits on all tasks to complete.
static Fiber WhenAll(Fiber [] fibers, CancellationToken cancellationToken)
Returns a fiber that waits on all fibers to complete.
static Fiber WhenAll(params Fiber [] fibers)
Returns a fiber that waits on all fibers to complete.
static Fiber WhenAll(Task [] tasks, int millisecondsTimeout)
Returns a fiber that waits on all tasks to complete.
static Fiber WhenAll(Fiber [] fibers, TimeSpan timeout)
Returns a fiber that waits on all fibers to complete.
static Fiber WhenAll(IEnumerable< Fiber > fibers, int millisecondsTimeout, CancellationToken cancellationToken, FiberScheduler scheduler)
Returns a fiber that waits on all fibers to complete.
static Fiber WhenAll(IEnumerable< Task > tasks, int millisecondsTimeout, CancellationToken cancellationToken, FiberScheduler scheduler)
Returns a fiber that waits on all tasks to complete.