Ejemplo n.º 1
0
        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);
        }