示例#1
0
        static void Main()
        {
            mrvts = new ManualResetValueTaskSource <int>();

            _task = new ValueTask <int>(mrvts, 0).ConfigureAwait(false);
            //mrvts.OnCompleted(s => { Console.WriteLine(1); }, null, 2, ValueTaskSourceOnCompletedFlags.None);
            //mrvts.Reset();
            //mrvts.Reset();
            //Console.WriteLine(mrvts.Version);

            //mrvts.SetResult(42);

            //Assert.Equal(ValueTaskSourceStatus.Succeeded, mrvts.GetStatus(2));
            //Assert.Equal(42, mrvts.GetResult(2));
            //Test();
            Task.Run(() =>
            {
                for (int i = 0; i < 10; i++)
                {
                    Run();
                    Thread.Sleep(3000);
                    mrvts.SetResult(i);
                    //mrvts.Reset();
                    //mrvts.ve
                }
            });
            //Assert.Equal(2, mrvts.Version);
            Console.ReadKey();
        }
        private protected async Task SerializeToStreamAsyncCore(
            Stream stream,
            TransportContext context,
            CancellationToken cancellationToken)
        {
            MultipartContent multipartContent = this;

            try
            {
                ConfiguredValueTaskAwaitable valueTaskAwaitable = MultipartContent.EncodeStringToStreamAsync(stream, "--" + multipartContent._boundary + "\r\n", cancellationToken).ConfigureAwait(false);
                await         valueTaskAwaitable;
                StringBuilder output = new StringBuilder();
                for (int contentIndex = 0; contentIndex < multipartContent._nestedContent.Count; ++contentIndex)
                {
                    HttpContent content = multipartContent._nestedContent[contentIndex];
                    valueTaskAwaitable = MultipartContent.EncodeStringToStreamAsync(stream, multipartContent.SerializeHeadersToString(output, contentIndex, content), cancellationToken).ConfigureAwait(false);
                    await valueTaskAwaitable;
                    await content.CopyToAsync(stream, context, cancellationToken).ConfigureAwait(false);

                    content = (HttpContent)null;
                }
                valueTaskAwaitable = MultipartContent.EncodeStringToStreamAsync(stream, "\r\n--" + multipartContent._boundary + "--\r\n", cancellationToken).ConfigureAwait(false);
                await valueTaskAwaitable;
                output = (StringBuilder)null;
            }
            catch (Exception ex)
            {
                if (NetEventSource.IsEnabled)
                {
                    NetEventSource.Error((object)multipartContent, (object)ex, nameof(SerializeToStreamAsyncCore));
                }
                throw;
            }
        }
示例#3
0
            private void Release()
            {
                _Operation  = null;
                _Collection = null;
                _Awaiter    = default;

                Waiters.Add(this);
            }
        public static ConfiguredValueTaskAwaitable EnsureCompleted(this ConfiguredValueTaskAwaitable awaitable, bool async)
        {
            if (!async)
            {
#if DEBUG
                VerifyTaskCompleted(awaitable.GetAwaiter().IsCompleted);
#endif
            }
            return(awaitable);
        }
        public void ConfigureAwait_AwaitMoveNextAsync_FlagsSetAppropriately(bool continueOnCapturedContext)
        {
            var enumerable = new TrackFlagsAsyncEnumerable()
            {
                Flags = 0
            };

            ConfiguredAsyncEnumerable <int> .Enumerator enumerator = enumerable.ConfigureAwait(continueOnCapturedContext).GetAsyncEnumerator();
            ConfiguredValueTaskAwaitable <bool> .ConfiguredValueTaskAwaiter moveNextAwaiter = enumerator.MoveNextAsync().GetAwaiter();
            moveNextAwaiter.UnsafeOnCompleted(() => { });
            Assert.Equal(
                continueOnCapturedContext ? ValueTaskSourceOnCompletedFlags.UseSchedulingContext : ValueTaskSourceOnCompletedFlags.None,
                enumerable.Flags);
        }
示例#6
0
            //****************************************

            public void Attach(AsyncCounterDecrement decrement)
            {
                var Task = new ValueTask <bool>(decrement, decrement.Version);

                _Awaiter = Task.ConfigureAwait(false).GetAwaiter();

                if (_Awaiter.IsCompleted)
                {
                    OnContinuePeekDecrement();
                }
                else
                {
                    _Awaiter.OnCompleted(_ContinuePeekDecrement);
                }
            }
示例#7
0
 public WithCancellationValueTaskAwaiter(ConfiguredValueTaskAwaitable <T> .ConfiguredValueTaskAwaiter awaiter, CancellationToken cancellationToken)
 {
     _taskAwaiter       = awaiter;
     _cancellationToken = cancellationToken;
 }
示例#8
0
 public WithCancellationValueTaskAwaitable(ValueTask <T> task, CancellationToken cancellationToken)
 {
     _awaitable         = task.ConfigureAwait(false);
     _cancellationToken = cancellationToken;
 }
示例#9
0
 private static bool GetContinueOnCapturedContext(ConfiguredValueTaskAwaitable task)
 => GetValueTaskContinueOnCapturedContext(task);
示例#10
0
 /// <summary>
 /// 结束对已完成任务的等待,并返回执行结果。
 /// </summary>
 /// <typeparam name="TResult">指定的结果类型。</typeparam>
 /// <param name="awaitable">给定的 <see cref="ConfiguredValueTaskAwaitable" />。</param>
 /// <returns>返回 <typeparamref name="TResult"/>。</returns>
 public static TResult AwaitResult <TResult>(this ConfiguredValueTaskAwaitable <TResult> awaitable)
 => awaitable.GetAwaiter().GetResult();
示例#11
0
    => task.ConfigureAwait(false);     // .NET 默认调用 task.ConfigureAwait(true);

    #endregion


    #region ConfiguredValueTaskAwaitable

    /// <summary>
    /// 结束对已完成任务的等待。
    /// </summary>
    /// <param name="awaitable">给定的 <see cref="ConfiguredValueTaskAwaitable" />。</param>
    public static void Await(this ConfiguredValueTaskAwaitable awaitable)
    => awaitable.GetAwaiter().GetResult();
示例#12
0
 public ConfiguredValueTaskAwaiterWrapper(ConfiguredValueTaskAwaitable <TResult> .ConfiguredValueTaskAwaiter cfgAwaiter)
 {
     _cfgAwaiter = cfgAwaiter;
 }
示例#13
0
 public ConfiguredValueTaskAwaitableWrapper(ConfiguredValueTaskAwaitable <TResult> cfgAwaitable)
 {
     _cfgAwaitable = cfgAwaitable;
 }
示例#14
0
 public ConfiguredValueTaskAwaitableWrapper(ConfiguredValueTaskAwaitable <TResult> awaitable)
 {
     _awaitable = awaitable;
 }
 public static ConfiguredValueTaskAwaitable EnsureCompleted(this ConfiguredValueTaskAwaitable task, bool async)
 {
     Debug.Assert(async || task.GetAwaiter().IsCompleted);
     return(task);
 }
示例#16
0
 public ConfiguredValueTaskAwaiterWrapper(ConfiguredValueTaskAwaitable <TResult> .ConfiguredValueTaskAwaiter awaiter)
 {
     _awaiter = awaiter;
 }
            public void MoveNext()
            {
                try
                {
                    bool waitToReadResult = false;
                    switch ((State)_state)
                    {
                    case State.OuterLoop:
                        ValueTask <bool> waitToReadTask = _reader.WaitToReadAsync(_cancellationToken);
                        if (waitToReadTask.IsCompleted)
                        {
                            // WaitToReadAsync completed.  Get the result and jump to process it.
                            waitToReadResult = waitToReadTask.GetAwaiter().GetResult();
                            _state           = (int)State.HaveWaitToReadResult;
                            goto case State.HaveWaitToReadResult;
                        }

                        // WaitToReadAsync wasn't yet complete.  Mark that the promise
                        // is being used for the result, set where we should return to when it completes,
                        // store the awaiter, and hook up the continuation.
                        _usePromiseForResult = true;
                        _state             = (int)State.FinishingAwait;
                        _waitToReadAwaiter = waitToReadTask.ConfigureAwait(false).GetAwaiter();
                        AsyncEnumerable inst = this;
                        _builder.AwaitUnsafeOnCompleted(ref _waitToReadAwaiter, ref inst);
                        return;

                    case State.FinishingAwait:
                        // The await on WaitToReadAsync finished.  Get its result and process it.
                        waitToReadResult = _waitToReadAwaiter.GetResult();
                        _state           = (int)State.HaveWaitToReadResult;
                        goto case State.HaveWaitToReadResult;

                    case State.HaveWaitToReadResult:
                        // We have a result from WaitToReadAsync.  If an item might be available,
                        // jump to try to read it.  If an item will never be available, complete.
                        if (waitToReadResult)
                        {
                            _state = (int)State.TryRead;
                            goto case State.TryRead;
                        }
                        else
                        {
                            _state = (int)State.Completing;
                            goto case State.Completing;
                        }

                    case State.TryRead:
                        // Do the read.  If we successfully get an item, mark that an item is
                        // available.  Then if we've already awaited as part of this MoveNextAsync,
                        // also complete the promise.
                        if (_reader.TryRead(out _current))
                        {
                            _itemAvailable = true;
                            if (_usePromiseForResult)
                            {
                                _promise.SetResult(true);
                            }
                            return;
                        }
                        else
                        {
                            // No item was available.  Start over.
                            _state = (int)State.OuterLoop;
                            goto case State.OuterLoop;
                        }

                    case State.Completing:
                        // Cleanup.  And if there's an outstanding promise, complete it
                        // to indicate iteration is done.
                        _builder.Complete();
                        _state = (int)State.Done;
                        if (_usePromiseForResult)
                        {
                            _promise.SetResult(false);
                        }
                        return;
                    }
                }
                catch (Exception e)
                {
                    _state = (int)State.Done;
                    _builder.Complete();
                    _itemAvailable       = false;
                    _usePromiseForResult = true;
                    _promise.SetException(e);
                }
            }