Fiber.WhenAny.cs
Go to the documentation of this file.
1 using System;
2 using System.Linq;
3 using System.Threading;
5 using System.Collections;
7 
8 namespace SpicyPixel.Threading
9 {
10  public partial class Fiber
11  {
20  public static Fiber WhenAny (params Fiber[] fibers)
21  {
22  return WhenAny (fibers, Timeout.Infinite, CancellationToken.None);
23  }
24 
34  public static Fiber WhenAny (Fiber[] fibers, CancellationToken cancellationToken)
35  {
36  return WhenAny (fibers, Timeout.Infinite, cancellationToken);
37  }
38 
48  public static Fiber WhenAny (Fiber[] fibers, TimeSpan timeout)
49  {
50  return WhenAny (fibers, CheckTimeout (timeout), CancellationToken.None);
51  }
52 
62  public static Fiber WhenAny (Fiber[] fibers, int millisecondsTimeout)
63  {
64  return WhenAny (fibers, millisecondsTimeout, CancellationToken.None);
65  }
66 
77  public static Fiber WhenAny (Fiber[] fibers, int millisecondsTimeout, CancellationToken cancellationToken)
78  {
79  return WhenAny(fibers, millisecondsTimeout, cancellationToken, FiberScheduler.Current);
80  }
81 
93  public static Fiber WhenAny (Fiber[] fibers, int millisecondsTimeout, CancellationToken cancellationToken, FiberScheduler scheduler)
94  {
95  if (fibers == null)
96  throw new ArgumentNullException ("fibers");
97 
98  foreach (var fiber in fibers) {
99  if (fiber == null)
100  throw new ArgumentException ("fibers", "the fibers argument contains a null element");
101  }
102 
103  return Fiber.Factory.StartNew(WhenAnyFibersCoroutine(fibers, millisecondsTimeout, cancellationToken), cancellationToken, scheduler);
104  }
105 
117  public static Fiber WhenAny (IEnumerable<Fiber> fibers, int millisecondsTimeout, CancellationToken cancellationToken, FiberScheduler scheduler)
118  {
119  return WhenAny(fibers.ToArray(), millisecondsTimeout, cancellationToken, scheduler);
120  }
121 
122  static IEnumerator WhenAnyFibersCoroutine(IEnumerable<Fiber> fibers, int millisecondsTimeout, CancellationToken cancellationToken)
123  {
124  var startWait = DateTime.Now;
125  while (true) {
126  if ((millisecondsTimeout != Timeout.Infinite
127  && (DateTime.Now - startWait).TotalMilliseconds >= millisecondsTimeout) ||
128  cancellationToken.IsCancellationRequested) {
129  yield return new FiberResult(null);
130  }
131 
132  var fiber = fibers.FirstOrDefault(f => f.IsCompleted);
133 
134  if (fiber != null) {
135  yield return new FiberResult(fiber);
136  }
137 
138  yield return FiberInstruction.YieldToAnyFiber;
139  }
140  }
141 
150  public static Fiber WhenAny (params Task [] tasks)
151  {
152  return WhenAny (tasks, Timeout.Infinite, CancellationToken.None);
153  }
154 
164  public static Fiber WhenAny (Task [] tasks, CancellationToken cancellationToken)
165  {
166  return WhenAny (tasks, Timeout.Infinite, cancellationToken);
167  }
168 
178  public static Fiber WhenAny (Task [] tasks, TimeSpan timeout)
179  {
180  return WhenAny (tasks, CheckTimeout (timeout), CancellationToken.None);
181  }
182 
192  public static Fiber WhenAny (Task [] tasks, int millisecondsTimeout)
193  {
194  return WhenAny (tasks, millisecondsTimeout, CancellationToken.None);
195  }
196 
207  public static Fiber WhenAny (Task [] tasks, int millisecondsTimeout, CancellationToken cancellationToken)
208  {
209  return WhenAny (tasks, millisecondsTimeout, cancellationToken, FiberScheduler.Current);
210  }
211 
223  public static Fiber WhenAny (Task [] tasks, int millisecondsTimeout, CancellationToken cancellationToken, FiberScheduler scheduler)
224  {
225  if (tasks == null)
226  throw new ArgumentNullException ("tasks");
227 
228  foreach (var fiber in tasks) {
229  if (fiber == null)
230  throw new ArgumentException ("tasks", "the tasks argument contains a null element");
231  }
232 
233  return Fiber.Factory.StartNew (WhenAnyTasksCoroutine (tasks, millisecondsTimeout, cancellationToken), cancellationToken, scheduler);
234  }
235 
247  public static Fiber WhenAny (IEnumerable<Task> tasks, int millisecondsTimeout, CancellationToken cancellationToken, FiberScheduler scheduler)
248  {
249  return WhenAny (tasks.ToArray (), millisecondsTimeout, cancellationToken, scheduler);
250  }
251 
252  static IEnumerator WhenAnyTasksCoroutine (IEnumerable<Task> tasks, int millisecondsTimeout, CancellationToken cancellationToken)
253  {
254  var startWait = DateTime.Now;
255  while (true) {
256  if ((millisecondsTimeout != Timeout.Infinite
257  && (DateTime.Now - startWait).TotalMilliseconds >= millisecondsTimeout) ||
258  cancellationToken.IsCancellationRequested) {
259  yield return new FiberResult (null);
260  }
261 
262  var fiber = tasks.FirstOrDefault (f => f.IsCompleted);
263 
264  if (fiber != null) {
265  yield return new FiberResult (fiber);
266  }
267 
268  yield return FiberInstruction.YieldToAnyFiber;
269  }
270  }
271  }
272 }
273 
Schedules fibers for execution.
Fiber StartNew(IEnumerator coroutine)
Start executing a new fiber using the default scheduler on the thread.
static Fiber WhenAny(params Task [] tasks)
Returns a fiber that completes when any task finishes.
static Fiber WhenAny(Fiber[] fibers, int millisecondsTimeout, CancellationToken cancellationToken, FiberScheduler scheduler)
Returns a fiber that completes when any fiber finishes.
static FiberFactory Factory
Gets the default factory for creating fibers.
Definition: Fiber.cs:119
static Fiber WhenAny(Task [] tasks, CancellationToken cancellationToken)
Returns a fiber that completes when any task finishes.
static Fiber WhenAny(Fiber[] fibers, TimeSpan timeout)
Returns a fiber that completes when any fiber finishes.
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
static Fiber WhenAny(Task [] tasks, TimeSpan timeout)
Returns a fiber that completes when any task finishes.
static Fiber WhenAny(Task [] tasks, int millisecondsTimeout, CancellationToken cancellationToken, FiberScheduler scheduler)
Returns a fiber that completes when any task finishes.
static Fiber WhenAny(Task [] tasks, int millisecondsTimeout)
Returns a fiber that completes when any task finishes.
static Fiber WhenAny(IEnumerable< Fiber > fibers, int millisecondsTimeout, CancellationToken cancellationToken, FiberScheduler scheduler)
Returns a fiber that completes when any fiber finishes.
static Fiber WhenAny(Fiber[] fibers, int millisecondsTimeout, CancellationToken cancellationToken)
Returns a fiber that completes when any fiber finishes.
static Fiber WhenAny(Task [] tasks, int millisecondsTimeout, CancellationToken cancellationToken)
Returns a fiber that completes when any task finishes.
static FiberScheduler Current
Gets the default fiber scheduler for the thread.
static Fiber WhenAny(IEnumerable< Task > tasks, int millisecondsTimeout, CancellationToken cancellationToken, FiberScheduler scheduler)
Returns a fiber that completes when any task finishes.
static Fiber WhenAny(Fiber[] fibers, int millisecondsTimeout)
Returns a fiber that completes when any fiber finishes.
static Fiber WhenAny(Fiber[] fibers, CancellationToken cancellationToken)
Returns a fiber that completes when any fiber finishes.
static Fiber WhenAny(params Fiber[] fibers)
Returns a fiber that completes when any fiber finishes.