public Task ContinueWith(IEnumerator coroutine, CancellationToken cancellationToken = default(CancellationToken)) { bool completed = false; var tcs = new TaskCompletionSource <int>(); var cancellation = cancellationToken.Register(() => tcs.TrySetCanceled()); Action <Task> completeTask = t => { immediateExecutor(() => { try { TaskScheduler.FromUnityContext().Post(WaitCoroutine(coroutine, () => tcs.TrySetResult(0))); cancellation.Dispose(); } catch (Exception e) { tcs.TrySetException(e); cancellation.Dispose(); } }); }; lock (mutex) { completed = IsCompleted; if (!completed) { continuations.Add(completeTask); } } if (completed) { completeTask(this); } return(tcs.Task); }