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;
6 
7 namespace SpicyPixel.Threading
8 {
9  public partial class Fiber
10  {
20  public static Fiber WhenAll (params Fiber[] fibers)
21  {
22  return WhenAll (fibers, Timeout.Infinite, CancellationToken.None);
23  }
24 
35  public static Fiber WhenAll (Fiber[] fibers, CancellationToken cancellationToken)
36  {
37  return WhenAll (fibers, Timeout.Infinite, cancellationToken);
38  }
39 
50  public static Fiber WhenAll (Fiber[] fibers, TimeSpan timeout)
51  {
52  return WhenAll (fibers, CheckTimeout (timeout), CancellationToken.None);
53  }
54 
65  public static Fiber WhenAll (Fiber[] fibers, int millisecondsTimeout)
66  {
67  return WhenAll (fibers, millisecondsTimeout, CancellationToken.None);
68  }
69 
81  public static Fiber WhenAll (Fiber[] fibers, int millisecondsTimeout, CancellationToken cancellationToken)
82  {
83  return WhenAll(fibers, millisecondsTimeout, cancellationToken, FiberScheduler.Current);
84  }
85 
98  public static Fiber WhenAll (Fiber[] fibers, int millisecondsTimeout, CancellationToken cancellationToken, FiberScheduler scheduler)
99  {
100  if (fibers == null)
101  throw new ArgumentNullException ("fibers");
102 
103  foreach (var fiber in fibers) {
104  if (fiber == null)
105  throw new ArgumentException ("fibers", "the fibers argument contains a null element");
106  }
107 
108  return Fiber.Factory.StartNew(WhenAllCoroutine(fibers, millisecondsTimeout, cancellationToken), scheduler);
109  }
110 
123  public static Fiber WhenAll (IEnumerable<Fiber> fibers, int millisecondsTimeout, CancellationToken cancellationToken, FiberScheduler scheduler)
124  {
125  return WhenAll(fibers.ToArray(), millisecondsTimeout, cancellationToken, scheduler);
126  }
127 
128  static IEnumerator WhenAllCoroutine(IEnumerable<Fiber> fibers, int millisecondsTimeout, CancellationToken cancellationToken)
129  {
130  var startWait = DateTime.Now;
131  while (true) {
132  if ((millisecondsTimeout != Timeout.Infinite
133  && (DateTime.Now - startWait).TotalMilliseconds >= millisecondsTimeout) ||
134  cancellationToken.IsCancellationRequested) {
135  yield return new FiberResult(false);
136  }
137 
138  if (fibers.All(f => f.IsCompleted)) {
139  yield return new FiberResult(true);
140  }
141 
142  yield return FiberInstruction.YieldToAnyFiber;
143  }
144  }
145  }
146 }
147 
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:120
A Fiber is a lightweight means of scheduling work that enables multiple units of processing to execut...
An instruction to stop fiber execution and set a result on the fiber.
Definition: FiberResult.cs:8
Represents a fiber instruction to be processed by a FiberScheduler.
static Fiber WhenAll(params Fiber[] fibers)
Returns a fiber that waits on all fibers to complete.
static Fiber WhenAll(Fiber[] fibers, int millisecondsTimeout, CancellationToken cancellationToken)
Returns a fiber that waits on all fibers to complete.
static YieldToAnyFiber YieldToAnyFiber
An instruction to cause the current fiber to yield to any ready fiber.
static FiberScheduler Current
Gets the default fiber scheduler for the thread.
static Fiber WhenAll(Fiber[] fibers, int millisecondsTimeout, CancellationToken cancellationToken, FiberScheduler scheduler)
Returns a fiber that waits on all fibers to complete.
static Fiber WhenAll(Fiber[] fibers, int millisecondsTimeout)
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(Fiber[] fibers, CancellationToken cancellationToken)
Returns a fiber that waits on all fibers to complete.
static Fiber WhenAll(Fiber[] fibers, TimeSpan timeout)
Returns a fiber that waits on all fibers to complete.