Fiber.ContinueWith.cs
Go to the documentation of this file.
1 using System;
2 using System.Threading;
4 using System.Collections;
5 
6 namespace SpicyPixel.Threading
7 {
8  public partial class Fiber
9  {
15  public Fiber ContinueWith(IEnumerator continuationCoroutine)
16  {
17  return ContinueWith(continuationCoroutine, CancellationToken.None, FiberContinuationOptions.None, FiberScheduler.Current);
18  }
19 
26  public Fiber ContinueWith(IEnumerator continuationCoroutine, CancellationToken cancellationToken)
27  {
28  return ContinueWith(continuationCoroutine, cancellationToken, FiberContinuationOptions.None, FiberScheduler.Current);
29  }
30 
37  public Fiber ContinueWith(IEnumerator continuationCoroutine, FiberContinuationOptions continuationOptions)
38  {
39  return ContinueWith(continuationCoroutine, CancellationToken.None, continuationOptions, FiberScheduler.Current);
40  }
41 
48  public Fiber ContinueWith(IEnumerator continuationCoroutine, FiberScheduler scheduler)
49  {
50  return ContinueWith(continuationCoroutine, CancellationToken.None, FiberContinuationOptions.None, scheduler);
51  }
52 
61  public Fiber ContinueWith(IEnumerator continuationCoroutine, CancellationToken cancellationToken,
62  FiberContinuationOptions continuationOptions, FiberScheduler scheduler)
63  {
64  if (continuationCoroutine == null)
65  throw new ArgumentNullException("continuationCoroutine");
66 
67  if (scheduler == null)
68  throw new ArgumentNullException("scheduler");
69 
70  var fiber = new Fiber(continuationCoroutine, cancellationToken);
71 
72  fiber.antecedent = this;
73  fiber.status = (int)FiberStatus.WaitingForActivation;
74 
75  var continuation = new FiberContinuation(fiber, continuationOptions, scheduler);
76 
77  if (IsCompleted) {
78  continuation.Execute();
79  } else {
80  // Lazy create queue
81  if (continuations == null)
82  continuations = new Queue<FiberContinuation>();
83 
84  continuations.Enqueue(continuation);
85  }
86 
87  return fiber;
88  }
89 
95  public Fiber ContinueWith(Action<Fiber> continuationAction)
96  {
97  return ContinueWith(continuationAction, CancellationToken.None, FiberContinuationOptions.None, FiberScheduler.Current);
98  }
99 
106  public Fiber ContinueWith(Action<Fiber> continuationAction, CancellationToken cancellationToken)
107  {
108  return ContinueWith(continuationAction, cancellationToken, FiberContinuationOptions.None, FiberScheduler.Current);
109  }
110 
117  public Fiber ContinueWith(Action<Fiber> continuationAction, FiberContinuationOptions continuationOptions)
118  {
119  return ContinueWith(continuationAction, CancellationToken.None, continuationOptions, FiberScheduler.Current);
120  }
121 
128  public Fiber ContinueWith(Action<Fiber> continuationAction, FiberScheduler scheduler)
129  {
130  return ContinueWith(continuationAction, CancellationToken.None, FiberContinuationOptions.None, scheduler);
131  }
132 
141  public Fiber ContinueWith(Action<Fiber> continuationAction, CancellationToken cancellationToken,
142  FiberContinuationOptions continuationOptions, FiberScheduler scheduler)
143  {
144  return ContinueWith((fiber, state) => continuationAction(fiber), null, cancellationToken, continuationOptions, scheduler);
145  }
146 
153  public Fiber ContinueWith(Action<Fiber, object> continuationAction, object state)
154  {
155  return ContinueWith(continuationAction, state, CancellationToken.None, FiberContinuationOptions.None, FiberScheduler.Current);
156  }
157 
165  public Fiber ContinueWith(Action<Fiber, object> continuationAction, object state, CancellationToken cancellationToken)
166  {
167  return ContinueWith(continuationAction, state, cancellationToken, FiberContinuationOptions.None, FiberScheduler.Current);
168  }
169 
177  public Fiber ContinueWith(Action<Fiber, object> continuationAction, object state, FiberContinuationOptions continuationOptions)
178  {
179  return ContinueWith(continuationAction, state, CancellationToken.None, continuationOptions, FiberScheduler.Current);
180  }
181 
189  public Fiber ContinueWith(Action<Fiber, object> continuationAction, object state, FiberScheduler scheduler)
190  {
191  return ContinueWith(continuationAction, state, CancellationToken.None, FiberContinuationOptions.None, scheduler);
192  }
193 
203  public Fiber ContinueWith(Action<Fiber, object> continuationAction, object state, CancellationToken cancellationToken,
204  FiberContinuationOptions continuationOptions, FiberScheduler scheduler)
205  {
206  if (continuationAction == null)
207  throw new ArgumentNullException("continuationAction");
208 
209  if (scheduler == null)
210  throw new ArgumentNullException("scheduler");
211 
212  var fiber = new Fiber((obj) => continuationAction(this, obj),
213  state, cancellationToken);
214 
215  fiber.antecedent = this;
216  fiber.status = (int)FiberStatus.WaitingForActivation;
217 
218  var continuation = new FiberContinuation(fiber, continuationOptions, scheduler);
219 
220  if (IsCompleted) {
221  continuation.Execute();
222  } else {
223  // Lazy create queue
224  if (continuations == null)
225  continuations = new Queue<FiberContinuation>();
226 
227  continuations.Enqueue(continuation);
228  }
229 
230  return fiber;
231  }
232  }
233 }
234 
Schedules fibers for execution.
Fiber ContinueWith(Action< Fiber > continuationAction)
Creates a continuation that executes asynchronously when the target fiber completes.
A Fiber is a lightweight means of scheduling work that enables multiple units of processing to execut...
Fiber ContinueWith(Action< Fiber > continuationAction, CancellationToken cancellationToken)
Creates a continuation that executes asynchronously when the target fiber completes.
Fiber ContinueWith(Action< Fiber, object > continuationAction, object state, FiberContinuationOptions continuationOptions)
Creates a continuation that executes asynchronously when the target fiber completes.
Fiber ContinueWith(Action< Fiber, object > continuationAction, object state)
Creates a continuation that executes asynchronously when the target fiber completes.
Fiber ContinueWith(Action< Fiber, object > continuationAction, object state, CancellationToken cancellationToken)
Creates a continuation that executes asynchronously when the target fiber completes.
static FiberScheduler Current
Gets the default fiber scheduler for the thread.
Fiber ContinueWith(Action< Fiber > continuationAction, CancellationToken cancellationToken, FiberContinuationOptions continuationOptions, FiberScheduler scheduler)
Creates a continuation that executes asynchronously when the target fiber completes.
Fiber ContinueWith(Action< Fiber > continuationAction, FiberScheduler scheduler)
Creates a continuation that executes asynchronously when the target fiber completes.
Fiber ContinueWith(Action< Fiber, object > continuationAction, object state, CancellationToken cancellationToken, FiberContinuationOptions continuationOptions, FiberScheduler scheduler)
Creates a continuation that executes asynchronously when the target fiber completes.
Fiber ContinueWith(Action< Fiber > continuationAction, FiberContinuationOptions continuationOptions)
Creates a continuation that executes asynchronously when the target fiber completes.
FiberContinuationOptions
Specifies the behavior for a fiber that is created by using the Fiber.ContinueWith method...
Fiber ContinueWith(IEnumerator continuationCoroutine)
Creates a continuation that executes asynchronously when the target fiber completes.
Fiber ContinueWith(IEnumerator continuationCoroutine, CancellationToken cancellationToken, FiberContinuationOptions continuationOptions, FiberScheduler scheduler)
Creates a continuation that executes asynchronously when the target fiber completes.
Fiber ContinueWith(IEnumerator continuationCoroutine, CancellationToken cancellationToken)
Creates a continuation that executes asynchronously when the target fiber completes.
Fiber ContinueWith(Action< Fiber, object > continuationAction, object state, FiberScheduler scheduler)
Creates a continuation that executes asynchronously when the target fiber completes.
FiberStatus
Represents the current state of a fiber.
Definition: FiberStatus.cs:34
Fiber ContinueWith(IEnumerator continuationCoroutine, FiberScheduler scheduler)
Creates a continuation that executes asynchronously when the target fiber completes.
Fiber ContinueWith(IEnumerator continuationCoroutine, FiberContinuationOptions continuationOptions)
Creates a continuation that executes asynchronously when the target fiber completes.