Пример #1
0
        public static Task InvokeAsync(Func <Task> func)
        {
            TaskCompletionSource <object> tcl = new TaskCompletionSource <object>( );

            ThreadPool.QueueUserWorkItem(
                _ => {
                Task rt = func( );
                ConfiguredTaskAwaitable.ConfiguredTaskAwaiter cta =
                    rt.ConfigureAwait(false).GetAwaiter( );
                cta.OnCompleted(
                    () => {
                    if (rt.IsCanceled)
                    {
                        tcl.SetCanceled( );
                    }
                    else if (rt.IsFaulted)
                    {
                        // ReSharper disable once AssignNullToNotNullAttribute
                        tcl.SetException(rt.Exception);
                    }
                    else
                    {
                        tcl.SetResult(null);
                    }
                });
            });
            return(tcl.Task);
        }
Пример #2
0
            private void Execute()
            {
                try
                {
                    switch (state)
                    {
                    case BeginInitState:
                        voidAwaiter = System.Threading.Tasks.Task.Delay(dueTime, cancellation.Token).ConfigureAwait(false).GetAwaiter();
                        if (voidAwaiter.IsCompleted)
                        {
                            goto case EndInitState;
                        }
                        state = EndInitState;
                        voidAwaiter.OnCompleted(continuation);
                        break;

                    case EndInitState:
                        voidAwaiter.GetResult();
                        voidAwaiter = default;
                        goto case BeginLoopState;

                    case BeginLoopState:
                        boolAwaiter = callback.Invoke(cancellation.Token).ConfigureAwait(false).GetAwaiter();
                        if (boolAwaiter.IsCompleted)
                        {
                            goto case EndLoopState;
                        }
                        state = EndLoopState;
                        boolAwaiter.OnCompleted(continuation);
                        break;

                    case EndLoopState:
                        var success = boolAwaiter.GetResult();
                        boolAwaiter = default;
                        if (success)
                        {
                            goto case BeginDelayState;
                        }
                        TrySetResult(true);
                        break;

                    case BeginDelayState:
                        voidAwaiter = System.Threading.Tasks.Task.Delay(period, cancellation.Token).ConfigureAwait(false).GetAwaiter();
                        if (voidAwaiter.IsCompleted)
                        {
                            goto case EndDelayState;
                        }
                        state = EndDelayState;
                        voidAwaiter.OnCompleted(continuation);
                        break;

                    case EndDelayState:
                        voidAwaiter.GetResult();
                        voidAwaiter = default;
                        goto case BeginLoopState;
                    }
                }
                catch (OperationCanceledException)
                {
                    TrySetResult(false);
                }
                catch (Exception e)
                {
                    TrySetException(e);
                }

                if (Task.IsCompleted)
                {
                    cancellation.Dispose();
                }
            }
Пример #3
0
 /// <summary>Schedules the continuation action for these tasks.</summary>
 public void OnCompleted(Action continuation) =>
 _awaiter.OnCompleted(continuation);
Пример #4
0
 public override void OnCompleted(Action continuation) => awaiter.OnCompleted(continuation);
Пример #5
0
 void INotifyCompletion.OnCompleted(Action continuation) => taskAwaiter.OnCompleted(continuation);
Пример #6
0
 public void OnCompleted(Action continuation) => _taskAwaiter.OnCompleted(WrapContinuation(continuation));
Пример #7
0
 public void OnCompleted(Action continuation)
 {
     _operationContext = OperationContext.Current;
     _awaiter.OnCompleted(continuation);
 }