public void Dispose() { if (OnEarlyDispose != null) { OnEarlyDispose(); OnEarlyDispose = null; } if (_Task != null) { _Task.Dispose(); } if (_SequenceFuture != null) { if (!_SequenceFuture.Completed) { _SequenceFuture.Dispose(); } } if (_Thunk != null) { _Thunk.Dispose(); _Thunk = null; } _Task = null; _Scheduler = null; }
public WaitForAll(params object[] objects) { ISchedulable s; IFuture f; IEnumerator <object> t; _Schedulables = new ISchedulable[objects.Length]; _Futures = new IFuture[objects.Length]; for (int i = 0; i < objects.Length; i++) { if ((s = objects[i] as ISchedulable) != null) { _Schedulables[i] = s; } else if ((f = objects[i] as IFuture) != null) { _Futures[i] = f; } else if ((t = objects[i] as IEnumerator <object>) != null) { _Schedulables[i] = new SchedulableGeneratorThunk(t); } else { throw new ArgumentException("WaitForAll arguments must be ISchedulable, IFuture or IEnumerator<object>", "objects"); } } }
public StoreResult( IEnumerator <object> task, Expression <Func <T> > target, TaskExecutionPolicy executionPolicy = TaskExecutionPolicy.RunWhileFutureLives ) { _Task = task; _Thunk = new SchedulableGeneratorThunk(_Task); _ExecutionPolicy = executionPolicy; _Future = Future.New <T>(); _Future.Bind(target); _Future.RegisterOnComplete(Completed); }
protected void Start() { _Thunk = new SchedulableGeneratorThunk(_Task); _Thunk.OnNextValue = OnNextValue; _SequenceFuture = _Scheduler.Start(_Thunk, TaskExecutionPolicy.RunWhileFutureLives); _SequenceFuture.RegisterOnDispose((f) => { Resume(); Dispose(); }); _SequenceFuture.RegisterOnComplete((f) => { if (f.Failed) { Fail(f.Error); } else { Resume(); } }); }