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;
6 
7 namespace SpicyPixel.Threading
8 {
9  public partial class Fiber
10  {
19  public static Fiber WhenAny (params Fiber[] fibers)
20  {
21  return WhenAny (fibers, Timeout.Infinite, CancellationToken.None);
22  }
23 
33  public static Fiber WhenAny (Fiber[] fibers, CancellationToken cancellationToken)
34  {
35  return WhenAny (fibers, Timeout.Infinite, cancellationToken);
36  }
37 
47  public static Fiber WhenAny (Fiber[] fibers, TimeSpan timeout)
48  {
49  return WhenAny (fibers, CheckTimeout (timeout), CancellationToken.None);
50  }
51 
61  public static Fiber WhenAny (Fiber[] fibers, int millisecondsTimeout)
62  {
63  return WhenAny (fibers, millisecondsTimeout, CancellationToken.None);
64  }
65 
76  public static Fiber WhenAny (Fiber[] fibers, int millisecondsTimeout, CancellationToken cancellationToken)
77  {
78  return WhenAny(fibers, millisecondsTimeout, cancellationToken, FiberScheduler.Current);
79  }
80 
92  public static Fiber WhenAny (Fiber[] fibers, int millisecondsTimeout, CancellationToken cancellationToken, FiberScheduler scheduler)
93  {
94  if (fibers == null)
95  throw new ArgumentNullException ("fibers");
96 
97  foreach (var fiber in fibers) {
98  if (fiber == null)
99  throw new ArgumentException ("fibers", "the fibers argument contains a null element");
100  }
101 
102  return Fiber.Factory.StartNew(WhenAnyCoroutine(fibers, millisecondsTimeout, cancellationToken), scheduler);
103  }
104 
116  public static Fiber WhenAny (IEnumerable<Fiber> fibers, int millisecondsTimeout, CancellationToken cancellationToken, FiberScheduler scheduler)
117  {
118  return WhenAny(fibers.ToArray(), millisecondsTimeout, cancellationToken, scheduler);
119  }
120 
121  static IEnumerator WhenAnyCoroutine(IEnumerable<Fiber> fibers, int millisecondsTimeout, CancellationToken cancellationToken)
122  {
123  var startWait = DateTime.Now;
124  while (true) {
125  if ((millisecondsTimeout != Timeout.Infinite
126  && (DateTime.Now - startWait).TotalMilliseconds >= millisecondsTimeout) ||
127  cancellationToken.IsCancellationRequested) {
128  yield return new FiberResult(null);
129  }
130 
131  var fiber = fibers.FirstOrDefault(f => f.IsCompleted);
132 
133  if (fiber != null) {
134  yield return new FiberResult(fiber);
135  }
136 
137  yield return FiberInstruction.YieldToAnyFiber;
138  }
139  }
140  }
141 }
142 
Schedules fibers for execution.
Fiber StartNew(IEnumerator coroutine)
Start executing a new fiber using the default scheduler on the thread.
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:120
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
Represents a fiber instruction to be processed by a FiberScheduler.
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 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 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.