Esempio n. 1
0
        public override ManualResetValueTaskSource <object> GetAwaitable()
        {
            if (_awaitableQueue == null)
            {
                _awaitableQueue = new Queue <ManualResetValueTaskSource <object> >();
                _awaitableCache = new Queue <ManualResetValueTaskSource <object> >();
            }

            // First attempt to reuse an existing awaitable in the queue
            // to save allocating a new instance.
            if (_awaitableCache.TryDequeue(out var awaitable))
            {
                // Reset previously used awaitable
                Debug.Assert(awaitable.GetStatus() == ValueTaskSourceStatus.Succeeded, "Previous awaitable should have been completed.");
                awaitable.Reset();
            }
            else
            {
                awaitable = new ManualResetValueTaskSource <object>();
            }

            _awaitableQueue.Enqueue(awaitable);

            return(awaitable);
        }
Esempio n. 2
0
        public async Task SetResult_RunContinuationsAsynchronously_ContinuationInvokedAccordingly(bool runContinuationsAsynchronously)
        {
            var mrvts = new ManualResetValueTaskSource <int>()
            {
                RunContinuationsAsynchronously = runContinuationsAsynchronously
            };

            for (short i = 0; i < 10; i++)
            {
                var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);

                var tl = new ThreadLocal <int> {
                    Value = 42
                };
                mrvts.OnCompleted(
                    _ =>
                {
                    Assert.Equal(!runContinuationsAsynchronously, tl.Value == 42);
                    tcs.SetResult();
                },
                    null,
                    i,
                    ValueTaskSourceOnCompletedFlags.None);
                mrvts.SetResult(42);
                mrvts.Reset();

                tl.Value = 0;

                await tcs.Task;
            }
        }
Esempio n. 3
0
        public async Task SynchronizationContext_CaptureIfRequested(
            bool runContinuationsAsynchronously, bool captureSyncCtx, bool setBeforeOnCompleted)
        {
            await Task.Run(async() =>  // escape xunit sync ctx
            {
                var mrvts = new ManualResetValueTaskSource <int>()
                {
                    RunContinuationsAsynchronously = runContinuationsAsynchronously
                };

                if (setBeforeOnCompleted)
                {
                    mrvts.SetResult(42);
                }

                var tcs = new TaskCompletionSource();
                var sc  = new TrackingSynchronizationContext();
                SynchronizationContext.SetSynchronizationContext(sc);
                Assert.Equal(0, sc.Posts);
                mrvts.OnCompleted(
                    _ => tcs.SetResult(),
                    null,
                    0,
                    captureSyncCtx ? ValueTaskSourceOnCompletedFlags.UseSchedulingContext : ValueTaskSourceOnCompletedFlags.None);
                SynchronizationContext.SetSynchronizationContext(null);

                if (!setBeforeOnCompleted)
                {
                    mrvts.SetResult(42);
                }

                await tcs.Task;
                Assert.Equal(captureSyncCtx ? 1 : 0, sc.Posts);
            });
        }
Esempio n. 4
0
        public void OnCompleted_UsedTwiceBeforeCompletion_Throws()
        {
            var mrvts = new ManualResetValueTaskSource <int>();

            mrvts.OnCompleted(_ => { }, null, 0, ValueTaskSourceOnCompletedFlags.None);
            Assert.Throws <InvalidOperationException>(() => mrvts.OnCompleted(_ => { }, null, 0, ValueTaskSourceOnCompletedFlags.None));
        }
Esempio n. 5
0
        private async Task <RemoteInvokeResultMessage> RegisterResultCallbackAsync(string id,
                                                                                   CancellationToken cancellationToken)
        {
            if (_logger.IsEnabled(LogLevel.Debug))
            {
                _logger.LogDebug($"准备获取Id为:{id}的响应内容。");
            }

            var task = new ManualResetValueTaskSource <TransportMessage>();

            _resultDictionary.TryAdd(id, task);
            try
            {
                var result = await task.AwaitValue(cancellationToken);

                return(result.GetContent <RemoteInvokeResultMessage>());
            }
            finally
            {
                // 删除回调任务
                ManualResetValueTaskSource <TransportMessage> value;
                _resultDictionary.TryRemove(id, out value);
                value.SetCanceled();
            }
        }
Esempio n. 6
0
        public async Task SetResult_AfterOnCompleted_ResultAvailableAsynchronously()
        {
            var mrvts = new ManualResetValueTaskSource <int>();

            mrvts.Reset();
            mrvts.Reset();
            Assert.Equal(2, mrvts.Version);

            Assert.Equal(ValueTaskSourceStatus.Pending, mrvts.GetStatus(2));
            Assert.Throws <InvalidOperationException>(() => mrvts.GetResult(2));

            var onCompletedRan = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);

            mrvts.OnCompleted(s => ((TaskCompletionSource)s).SetResult(), onCompletedRan, 2, ValueTaskSourceOnCompletedFlags.None);

            Assert.False(onCompletedRan.Task.IsCompleted);
            await Task.Delay(1);

            Assert.False(onCompletedRan.Task.IsCompleted);

            mrvts.SetResult(42);
            Assert.Equal(ValueTaskSourceStatus.Succeeded, mrvts.GetStatus(2));
            Assert.Equal(42, mrvts.GetResult(2));

            await onCompletedRan.Task;

            Assert.Equal(2, mrvts.Version);
        }
Esempio n. 7
0
        public void SetResult_RunContinuationsAsynchronously_ContinuationInvokedAccordingly(bool runContinuationsAsynchronously)
        {
            var mres  = new ManualResetEventSlim();
            var mrvts = new ManualResetValueTaskSource <int>()
            {
                RunContinuationsAsynchronously = runContinuationsAsynchronously
            };

            for (short i = 0; i < 10; i++)
            {
                int threadId = Environment.CurrentManagedThreadId;
                mrvts.OnCompleted(
                    _ =>
                {
                    Assert.Equal(!runContinuationsAsynchronously, threadId == Environment.CurrentManagedThreadId);
                    mres.Set();
                },
                    null,
                    i,
                    ValueTaskSourceOnCompletedFlags.None);
                mrvts.SetResult(42);
                mres.Wait();
                mrvts.Reset();
                mres.Reset();
            }
        }
        public int AdvanceUpToAndWait(long bytes, out ValueTask <object?> availabilityTask)
        {
            var leastAvailableFlow = _connectionLevelFlowControl.Available < _streamLevelFlowControl.Available
                ? _connectionLevelFlowControl : _streamLevelFlowControl;

            // Clamp ~= Math.Clamp from netcoreapp >= 2.0
            var actual = Clamp(leastAvailableFlow.Available, 0, bytes);

            // Make sure to advance prior to accessing AvailabilityAwaitable.
            _connectionLevelFlowControl.Advance(actual);
            _streamLevelFlowControl.Advance(actual);

            availabilityTask = default;
            _currentConnectionLevelAwaitable        = null;
            _currentConnectionLevelAwaitableVersion = -1;

            if (actual < bytes)
            {
                var awaitable = leastAvailableFlow.AvailabilityAwaitable;

                if (leastAvailableFlow == _connectionLevelFlowControl)
                {
                    _currentConnectionLevelAwaitable        = awaitable;
                    _currentConnectionLevelAwaitableVersion = awaitable.Version;
                }

                availabilityTask = new ValueTask <object?>(awaitable, awaitable.Version);
            }

            return(actual);
        }
        public void AccessAfterReset_Fails()
        {
            var mrvts = new ManualResetValueTaskSource <int>();

            mrvts.Reset();
            Assert.Throws <InvalidOperationException>(() => mrvts.GetResult(0));
            Assert.Throws <InvalidOperationException>(() => mrvts.GetStatus(0));
            Assert.Throws <InvalidOperationException>(() => mrvts.OnCompleted(_ => { }, new object(), 0, ValueTaskSourceOnCompletedFlags.None));
        }
Esempio n. 10
0
        public void SetException_OperationCanceledException_StatusIsCanceled()
        {
            var mrvts = new ManualResetValueTaskSource <int>();
            var e     = new OperationCanceledException();

            mrvts.SetException(e);
            Assert.Equal(ValueTaskSourceStatus.Canceled, mrvts.GetStatus(0));
            Assert.Same(e, Assert.Throws <OperationCanceledException>(() => mrvts.GetResult(0)));
        }
Esempio n. 11
0
 public async Task ManualTaskSource(int count)
 {
     for (int i = 0; i < count; i++)
     {
         var source = new ManualResetValueTaskSource <int>();
         source.SetResult(i);
         await source.AsTask();
     }
 }
        public async Task Create()
        {
            var source    = new ManualResetValueTaskSource <int>();
            var valueTask = new ValueTask <int>(source, 0);

            source.SetResult(10);
            var result = await valueTask;

            Assert.True(result == 10);
        }
 public void Reset(uint initialWindowSize)
 {
     _streamLevelFlowControl.Reset(initialWindowSize);
     if (_currentConnectionLevelAwaitable != null)
     {
         Debug.Assert(_currentConnectionLevelAwaitable.GetStatus() == ValueTaskSourceStatus.Succeeded, "Should have been completed by the previous stream.");
         _currentConnectionLevelAwaitable        = null;
         _currentConnectionLevelAwaitableVersion = -1;
     }
 }
Esempio n. 14
0
        public CircleTaskBuffer()
        {
            var first = new SingleLinks5 <T>(ArrayLength);

            first.InReading = true;
            first.Next      = first;
            _writePtr       = first;
            _readPtr        = first;
            _currentWrite   = first.Buffer;
            _currentRead    = first.Buffer;
            Parallel.For(0, ArrayLength, (index) => { _currentWrite[index] = new ManualResetValueTaskSource <T>(); });
        }
Esempio n. 15
0
        public async Task ReuseInstanceWithResets_Success()
        {
            var mrvts = new ManualResetValueTaskSource <int>();

            for (short i = 42; i < 48; i++)
            {
                var ignored = Task.Delay(1).ContinueWith(_ => mrvts.SetResult(i));
                Assert.Equal(i, await new ValueTask <int>(mrvts, mrvts.Version));
                Assert.Equal(i, await new ValueTask <int>(mrvts, mrvts.Version)); // can use multiple times until it's reset

                mrvts.Reset();
            }
        }
Esempio n. 16
0
        public void SetTwice_Fails()
        {
            var mrvts = new ManualResetValueTaskSource <int>();

            mrvts.SetResult(42);
            Assert.Throws <InvalidOperationException>(() => mrvts.SetResult(42));
            Assert.Throws <InvalidOperationException>(() => mrvts.SetException(new Exception()));

            mrvts.Reset();
            mrvts.SetException(new Exception());
            Assert.Throws <InvalidOperationException>(() => mrvts.SetResult(42));
            Assert.Throws <InvalidOperationException>(() => mrvts.SetException(new Exception()));
        }
        public static ManualResetValueTaskSource <T> Completed <T>(T result, Exception error = null)
        {
            var vts = new ManualResetValueTaskSource <T>();

            if (error != null)
            {
                vts.SetException(error);
            }
            else
            {
                vts.SetResult(result);
            }
            return(vts);
        }
Esempio n. 18
0
    public override ManualResetValueTaskSource <object?> GetAwaitable()
    {
        if (_awaitable == null)
        {
            _awaitable = new ManualResetValueTaskSource <object?>();
        }
        else
        {
            Debug.Assert(_awaitable.GetStatus() == ValueTaskSourceStatus.Succeeded, "Previous awaitable should have been completed.");
            _awaitable.Reset();
        }

        return(_awaitable);
    }
Esempio n. 19
0
        private async Task <RemoteInvokeResultMessage> RegisterResultCallbackAsync(string id, CancellationToken cancellationToken)
        {
            if (_logger.IsEnabled(LogLevel.Debug))
            {
                _logger.LogDebug($"准备获取Id为:{id}的响应内容。");
            }

            var task = new ManualResetValueTaskSource <TransportMessage>();

            _resultDictionary.TryAdd(id, task);
            try
            {
                var result = await task.AwaitValue(cancellationToken);

                return(result.GetContent <RemoteInvokeResultMessage>());
            }
            catch (CPlatformException ex)
            {
                if (_logger.IsEnabled(LogLevel.Error))
                {
                    _logger.LogError(ex.Message, ex);
                }
                return(new RemoteInvokeResultMessage()
                {
                    ExceptionMessage = ex.Message,
                    StatusCode = ex.ExceptionCode,
                });
            }
            catch (Exception ex)
            {
                if (_logger.IsEnabled(LogLevel.Error))
                {
                    _logger.LogError(ex.Message, ex);
                }
                return(new RemoteInvokeResultMessage()
                {
                    ExceptionMessage = ex.Message,
                    StatusCode = StatusCode.UnKnownError,
                });
            }
            finally
            {
                //删除回调任务
                ManualResetValueTaskSource <TransportMessage> value;
                _resultDictionary.TryRemove(id, out value);
                value.SetCanceled();
            }
        }
Esempio n. 20
0
        public async Task CreateAndAwait_FromCompletedValueTaskSource_ConfigureAwait()
        {
            IValueTaskSource <int> vts = ManualResetValueTaskSource.Completed(42);

            foreach (BenchmarkIteration iteration in Benchmark.Iterations)
            {
                long iters = Benchmark.InnerIterationCount;
                using (iteration.StartMeasurement())
                {
                    for (long i = 0; i < iters; i++)
                    {
                        await new ValueTask <int>(vts, 0).ConfigureAwait(false);
                    }
                }
            }
        }
        public async Task Reset_Success()
        {
            var source    = new ManualResetValueTaskSource <int>();
            var valueTask = new ValueTask <int>(source, source.Version);

            source.SetResult(10);
            var result = await valueTask;

            Assert.True(result == 10);
            source.Reset();
            var valueTask_1 = new ValueTask <int>(source, source.Version);

            source.SetResult(100);
            result = await valueTask_1;
            Assert.True(result == 100);
        }
Esempio n. 22
0
        /// <summary>
        /// Complete with or without an error.
        /// </summary>
        public static void SetExceptionOrResult(this ManualResetValueTaskSource ts, Exception exceptionOrNot)
        {
            if (ts is null)
            {
                throw new ArgumentNullException(nameof(ts));
            }

            if (exceptionOrNot is null)
            {
                ts.SetResult();
            }
            else
            {
                ts.SetException(exceptionOrNot);
            }
        }
Esempio n. 23
0
        public void Copy_PassAsArgumentAndReturn_FromValueTaskSource()
        {
            ValueTask <int> vt = new ValueTask <int>(ManualResetValueTaskSource.Completed(42), 0);

            foreach (BenchmarkIteration iteration in Benchmark.Iterations)
            {
                long iters = Benchmark.InnerIterationCount;
                using (iteration.StartMeasurement())
                {
                    for (long i = 0; i < iters; i++)
                    {
                        vt = ReturnValueTask(vt);
                    }
                }
            }
        }
Esempio n. 24
0
        public async Task Await_FromCompletedValueTaskSource()
        {
            ValueTask <int> vt = new ValueTask <int>(ManualResetValueTaskSource.Completed <int>(42), 0);

            foreach (BenchmarkIteration iteration in Benchmark.Iterations)
            {
                long iters = Benchmark.InnerIterationCount;
                using (iteration.StartMeasurement())
                {
                    for (long i = 0; i < iters; i++)
                    {
                        await vt;
                    }
                }
            }
        }
Esempio n. 25
0
        /// <summary>
        /// 添加异步回调到表中
        /// </summary>
        /// <param name="Ids"></param>
        /// <returns></returns>
        protected virtual ManualResetValueTaskSource <Result> AddAsyncResult(long ids)
        {
            ManualResetValueTaskSource <Result> asyncResult = new ManualResetValueTaskSource <Result>();

            if (!AsyncResultDict.TryAdd(ids, asyncResult))
            {
                Log.InfoFormat("add async back have id:{ids}", ids);
                AsyncResultDict[ids] = asyncResult;
            }

            if (RequestOutTime > 0)
            {
                RequestOutTimeQueue.Enqueue(new RequestKeyTime(ids, TimeHelper.GetTime()));
            }

            return(asyncResult);
        }
        public static ManualResetValueTaskSource <T> Delay <T>(int delayMs, T result, Exception error = null)
        {
            var vts = new ManualResetValueTaskSource <T>();

            Task.Delay(delayMs).ContinueWith(_ =>
            {
                if (error != null)
                {
                    vts.SetException(error);
                }
                else
                {
                    vts.SetResult(result);
                }
            });
            return(vts);
        }
Esempio n. 27
0
        private async Task <object> RegisterResultCallbackAsync(string id, CancellationToken cancellationToken)
        {
            var task = new ManualResetValueTaskSource <TransportMessage>();

            _resultDictionary.TryAdd(id, task);
            try
            {
                var result = await task.AwaitValue(cancellationToken);

                return(result.GetContent <ReactiveResultMessage>()?.Result);
            }
            finally
            {
                //删除回调任务
                ManualResetValueTaskSource <TransportMessage> value;
                _resultDictionary.TryRemove(id, out value);
                value.SetCanceled();
            }
        }
Esempio n. 28
0
        public IAsyncEnumerator <T> GetAsyncEnumerator(CancellationToken token)
        {
            if (token.IsCancellationRequested)
            {
                return(new LinxAsyncEnumerable.ThrowIterator <T>(new OperationCanceledException(token)));
            }

            var state = Atomic.Lock(ref _state);

            if (state != _sInitial)
            {
                _state = state;
                return(new CoroutineIterator <T>(this).GetAsyncEnumerator(token));
            }

            try
            {
                _tsAccepting = new();
                _tsEmitting  = new();
                _tsEmitting.Reset();
                _state = _sEmitting;
                Produce(token);
                if (token.CanBeCanceled)
                {
                    _ctr = token.Register(() => SetFinal(new OperationCanceledException(token)));
                }
                return(this);
            }
            catch (Exception ex)
            {
                _state        = Atomic.LockBit;
                Current       = default;
                _tsAccepting  = default;
                _tsEmitting   = default;
                _atmbFinal    = default;
                _atmbDisposed = default;
                _ctr          = default;
                _state        = _sFinal;
                _atmbFinal.SetException(ex);
                _atmbDisposed.SetResult();
                return(new LinxAsyncEnumerable.ThrowIterator <T>(ex));
            }
        }
Esempio n. 29
0
        public CircleTaskBuffer2()
        {
            _writeQueue = new Queue <ManualResetValueTaskSource <T>[]>(32);
            _readQueue  = new Queue <ManualResetValueTaskSource <T>[]>(32);
            var _current = new ManualResetValueTaskSource <T> [ArrayLength];

            for (int i = 0; i < ArrayLength; i++)
            {
                _current[i] = new ManualResetValueTaskSource <T>();
            }
            _currentWrite = _current;
            _currentRead  = _current;
            _readQueue.Enqueue(_currentRead);
            //_list = new List<int>();
            //_cache = new HashSet<int>();
            //_index = new HashSet<int>();
            //_repeates = new List<ManualResetValueTaskSource<T>>();
            //Task.Run(() =>
            //{
            //    for (int i = 0; i < 10; i++)
            //    {
            //        Thread.Sleep(10000);
            //        if (_index.Count>0)
            //        {
            //            Console.WriteLine("HashCode:" + _list.Count);
            //            Console.WriteLine("自增索引:"+_index.Count);
            //            Console.WriteLine("无重复HashCode:" + _cache.Count);
            //        }

            //    }
            //    Console.WriteLine("End");

            //    foreach (var item in _repeates)
            //    {
            //        if (item.AwaitableTask.IsCanceled)
            //        {
            //            Console.WriteLine("已取消!");
            //        }
            //        item.SetResult((T)(object)(true));
            //    }
            //});
        }
Esempio n. 30
0
        public void SetResult_BeforeOnCompleted_ResultAvailableSynchronously()
        {
            var mrvts = new ManualResetValueTaskSource <int>();

            mrvts.Reset();
            mrvts.Reset();
            Assert.Equal(2, mrvts.Version);

            mrvts.SetResult(42);

            Assert.Equal(ValueTaskSourceStatus.Succeeded, mrvts.GetStatus(2));
            Assert.Equal(42, mrvts.GetResult(2));

            var mres = new ManualResetEventSlim();

            mrvts.OnCompleted(s => ((ManualResetEventSlim)s).Set(), mres, 2, ValueTaskSourceOnCompletedFlags.None);
            mres.Wait();

            Assert.Equal(2, mrvts.Version);
        }