コード例 #1
0
        public async Task DequeueAsync_GivenTokenIsCanceled_ShouldCancelTask()
        {
            //Arrange
            CancellationTokenSource source1 = new(), source2 = new();
            const int excepted = 1;
            var       queue = new AsyncQueue <int>();
            var       task1 = queue.Dequeue(source1.Token).AsTask();
            var       task2 = queue.Dequeue(source2.Token).AsTask();

            //Act
            source1.Cancel();
            queue.Enqueue(excepted);
            var exception = await Record.ExceptionAsync(() => task1).ConfigureAwait(false);

            await task2.ConfigureAwait(false);

            //Assert
            exception.Should().BeOfType <TaskCanceledException>();
            task2.Result.Should().Be(excepted);

            //Annihilate
            source1.Dispose();
            source2.Dispose();
            queue.Dispose();
        }
コード例 #2
0
        public async Task DequeueAsync_GivenTokenIsCanceled_ShouldCancelTask()
        {
            //Arrange
            CancellationTokenSource source1 = new CancellationTokenSource(), source2 = new CancellationTokenSource();
            const int excepted = 1;
            var       queue = new AsyncQueue <int>();
            var       task1 = queue.Dequeue(source1.Token);
            var       task2 = queue.Dequeue(source2.Token);

            //Act
            source1.Cancel();
            queue.Enqueue(excepted);
            var exception = await Record.ExceptionAsync(() => task1.AsTask()).ConfigureAwait(false); // xUnit can't record ValueTask yet

            await task2.ConfigureAwait(false);

            //Assert
            Assert.IsType <TaskCanceledException>(exception);
            Assert.Equal(excepted, task2.Result);

            //Annihilate
            source1.Dispose();
            source2.Dispose();
            queue.Dispose();
        }
コード例 #3
0
        private async Task ProcessHandler(AsyncQueue <OwnTcpSendMessage> queue)
        {
            while (true)
            {
                (_, OwnTcpSendMessage item) = await queue.Dequeue();

                if (queue.IsEnd)
                {
                    break;
                }

                try
                {
                    LockTopic(item.Message.Topic, item.Message.Payload);

                    bool success = HandlerMessage(item.Message);
                    item.SetResult(success);
                }
                catch (Exception e)
                {
                    item.SetException(e);
                }
                finally
                {
                    UnlockTopic(item.Message.Topic);
                }
            }
        }
コード例 #4
0
ファイル: Client.cs プロジェクト: junkdood/Otokoneko
        private async ValueTask SendAllRequestsInQueue(IEasyClient <Response, Request> client, int index)
        {
            if (!_uncheckedRequests.TryGetValue((EasyClient <Response>)client, out var uncheckedRequest))
            {
                return;
            }
            var success = false;

            while (!success)
            {
                success = await Connect(index);

                if (!success)
                {
                    Thread.Sleep(1000);
                }
            }
            while (_running)
            {
                if (_uncheckedRequests.Count > MaxSizeOfUncheckedRequestList)
                {
                    Thread.Sleep(100);
                    continue;
                }
                var request = await _toBeSendRequests.Dequeue();

                // 若请求已超时,则放弃
                if (request.IsTimeout)
                {
                    continue;
                }
                try
                {
                    await client.SendAsync(request.Request);

                    uncheckedRequest.Add(new Tuple <DateTime, RequestWithTimeout>(DateTime.Now, request));
                }
                catch
                {
                    if (!_running)
                    {
                        return;
                    }
                    await _toBeSendRequests.Enqueue(request,
                                                    new RequestPriority(0, request.Request.Id));

                    success = await Connect(index);

                    if (!success)
                    {
                        Thread.Sleep(200);
                    }
                }
            }
        }
コード例 #5
0
        /// <summary> Loop forever (or at least, until it's done). </summary>
        /// <remarks> Any exceptions thrown are passed to the exception callback. </remarks>
        private async Task Loop()
        {
            // Wait for initialization to finish and check success.
            try
            {
                await Ready.ConfigureAwait(false);
            }
            catch (OperationCanceledException) { throw; }
            catch (Exception e)
            {
                _log?.Error("While waiting to catch up with event stream.", e);
                return;
            }

            // The auto-refresh process
            // ========================

            // This is a background task that checks periodically whether
            // a synchronization with the remote stream has occurred. If
            // it has not, it performs one.

#pragma warning disable CS4014
            Task.Run(async() =>
            {
                while (!_cancel.IsCancellationRequested)
                {
                    var syncStep = Wrapper.SyncStep;

                    // RefreshPeriod/2 because it's possible to have a
                    // syncStep increment happen right before this 'await',
                    // in which case the delay will execute twice before
                    // it detects that no sync is happening.
                    await Task.Delay(TimeSpan.FromSeconds(RefreshPeriod / 2), _cancel);

                    if (syncStep == Wrapper.SyncStep)
                    {
                        await CatchUpAsync(default(CancellationToken));
                    }
                }
            }, _cancel);
#pragma warning restore CS4014

            // The actual loop
            // ===============

            while (!_cancel.IsCancellationRequested)
            {
                // This sleeps until an action becomes available in the queue
                var nextAction = await _pending.Dequeue(_cancel).ConfigureAwait(false);

                // The action does not throw (is it wrapped properly)
                await nextAction().ConfigureAwait(false);
            }
        }
コード例 #6
0
        public async Task DequeueAsync_GivenSequenceOfInput_ShouldReturnSameSequenceOfOutput()
        {
            //Arrange
            const int expected1 = 1, expected2 = 2;
            var       queue = new AsyncQueue <int>();

            queue.Enqueue(expected1);
            queue.Enqueue(expected2);

            //Act
            var actual1 = await queue.Dequeue().ConfigureAwait(false);

            var actual2 = await queue.Dequeue().ConfigureAwait(false);

            //Assert
            actual1.Should().Be(expected1);
            actual2.Should().Be(expected2);

            //Annihilate
            queue.Dispose();
        }
コード例 #7
0
        public async Task DequeueAsync_GivenSequenceOfInput_ShouldReturnSameSequenceOfOutput()
        {
            //Arrange
            const int value1 = 1, value2 = 2;
            var       queue = new AsyncQueue <int>();

            queue.Enqueue(value1);
            queue.Enqueue(value2);

            //Act
            var actual1 = await queue.Dequeue().ConfigureAwait(false);

            var actual2 = await queue.Dequeue().ConfigureAwait(false);

            //Assert
            Assert.Equal(value1, actual1);
            Assert.Equal(value2, actual2);

            //Annihilate
            queue.Dispose();
        }
コード例 #8
0
 async void Writer(NeoSocket neoSocket, AsyncQueue <byte[]> queue)
 {
     try
     {
         while (await queue.HasItemsAsync())
         {
             var buffer = queue.Dequeue();
             await neoSocket.WriteAsync(buffer, 0, buffer.Length);
         }
     }
     catch { queue.SetFinished(); }
     finally { neoSocket.Close(); }
 }
コード例 #9
0
ファイル: AsyncQueueTests.cs プロジェクト: Omsaaf/dotpulsar
        public async Task DequeueAsync_GivenMultipleDequeues_ShouldCompleteInOrderedSequence()
        {
            //Arrange
            const int value1 = 1, value2 = 2;
            var       queue    = new AsyncQueue <int>();
            var       dequeue1 = queue.Dequeue();
            var       dequeue2 = queue.Dequeue();

            queue.Enqueue(value1);
            queue.Enqueue(value2);

            //Act
            var actual1 = await dequeue1;
            var actual2 = await dequeue2;

            //Assert
            Assert.Equal(value1, actual1);
            Assert.Equal(value2, actual2);

            //Annihilate
            queue.Dispose();
        }
コード例 #10
0
        public async Task DequeueAsync_GivenMultipleDequeues_ShouldCompleteInOrderedSequence()
        {
            //Arrange
            const int expected1 = 1, expected2 = 2;
            var       queue    = new AsyncQueue <int>();
            var       dequeue1 = queue.Dequeue();
            var       dequeue2 = queue.Dequeue();

            queue.Enqueue(expected1);
            queue.Enqueue(expected2);

            //Act
            var actual1 = await dequeue1.ConfigureAwait(false);

            var actual2 = await dequeue2.ConfigureAwait(false);

            //Assert
            actual1.Should().Be(expected1);
            actual2.Should().Be(expected2);

            //Annihilate
            queue.Dispose();
        }
コード例 #11
0
        private async Task ExtMethodQueueTestAsync()
        {
            AsyncQueue <string> q = new AsyncQueue <string>(5);

            Func <Task> producer = async delegate()
            {
                #region

                for (int i = 0; i < 20; ++i)
                {
                    System.Diagnostics.Debug.WriteLine($"Writing {i}...");
                    await q.Enqueue($"Value: {i}", CancellationToken.None);
                }

                System.Diagnostics.Debug.WriteLine("Writing EOF...");

                q.WriteEof();

                #endregion
            };

            Func <Task> consumer = async delegate()
            {
                #region

                bool more = true;
                while (more)
                {
                    System.Diagnostics.Debug.WriteLine("Reading...");
                    Option <string> ostr = await q.Dequeue(CancellationToken.None);

                    if (ostr.HasValue)
                    {
                        System.Diagnostics.Debug.WriteLine($"Read {ostr.Value}");
                    }
                    else
                    {
                        System.Diagnostics.Debug.WriteLine("Read EOF...");
                        more = false;
                    }
                }

                #endregion
            };

            Task tProducer = Task.Run(producer);
            Task tConsumer = Task.Run(consumer);

            await Task.WhenAll(tProducer, tConsumer);
        }
コード例 #12
0
        private async Task Work()
        {
            while (true)
            {
                var task = await _waitingScheduleTask.Dequeue();

                if (task.Status != TaskStatus.Waiting)
                {
                    continue;
                }
                await Execute(task);

                await Task.Yield();
            }
        }
コード例 #13
0
        private void ThreadStart()
        {
            var state = _consumer.Enter();

            try
            {
                while (!Thread.IsStopRequested)
                {
                    _queue.Dequeue(this);
                }
            }
            finally
            {
                _consumer.Exit(state);
            }
        }
コード例 #14
0
        public async Task DequeueAsync_GivenQueueWasNotEmpty_ShouldCompleteDequeueTask()
        {
            //Arrange
            const int value = 1;
            var       queue = new AsyncQueue <int>();

            queue.Enqueue(value);

            //Act
            var actual = await queue.Dequeue().ConfigureAwait(false);

            //Assert
            Assert.Equal(value, actual);

            //Annihilate
            queue.Dispose();
        }
コード例 #15
0
        public async static void Run(AsyncQueue <string> urls, Action <string> action, CancellationToken token)
        {
            var outputFiles = new AsyncQueue <string>();

            AsyncHelper.RunTasks(urls, url => FetchSlideAsync(url, action, token), outputFiles, token);

            var fileNames = new List <string>();

            while (await outputFiles.HasItemsAsync(token))
            {
                fileNames.Add(outputFiles.Dequeue());
            }

            try { await Task.Delay(-1, token); }
            catch (TaskCanceledException) { }
            fileNames.Where(file => file != null).ToList().ForEach(File.Delete);
        }
コード例 #16
0
        public async Task DequeueAsync_GivenQueueWasNotEmpty_ShouldCompleteDequeueTask()
        {
            //Arrange
            const int expected = 1;
            var       queue    = new AsyncQueue <int>();

            queue.Enqueue(expected);

            //Act
            var actual = await queue.Dequeue().ConfigureAwait(false);

            //Assert
            actual.Should().Be(expected);

            //Annihilate
            queue.Dispose();
        }
コード例 #17
0
        public async Task Enqueue_GivenDequeueTaskWasWaiting_ShouldCompleteDequeueTask()
        {
            //Arrange
            const int expected    = 1;
            var       queue       = new AsyncQueue <int>();
            var       dequeueTask = queue.Dequeue();

            queue.Enqueue(expected);

            //Act
            var actual = await dequeueTask.ConfigureAwait(false);

            //Assert
            actual.Should().Be(expected);

            //Annihilate
            queue.Dispose();
        }
コード例 #18
0
        public async Task Enqueue_GivenDequeueTaskWasWaiting_ShouldCompleteDequeueTask()
        {
            //Arrange
            const int value       = 1;
            var       queue       = new AsyncQueue <int>();
            var       dequeueTask = queue.Dequeue();

            queue.Enqueue(value);

            //Act
            var actual = await dequeueTask.ConfigureAwait(false);

            //Assert
            Assert.Equal(value, actual);

            //Annihilate
            queue.Dispose();
        }
コード例 #19
0
        public Day15()
        {
            AsyncQueue <long> programInputs  = new AsyncQueue <long>();
            AsyncQueue <long> programOutputs = new AsyncQueue <long>();
            IntCodeAsync      intCode        = new IntCodeAsync(_program, programInputs.Dequeue, programOutputs.Enqueue);
            Task vm = Task.Run(intCode.RunAsync);

            Task <long> sendCommand(Direction d)
            {
                programInputs.Enqueue((long)d + 1);
                return(programOutputs.Dequeue());
            }

            async Task backtrackHelper(IntVec2 position)
            {
                foreach (Direction d in s_directions)
                {
                    IntVec2 candidatePosition = position + s_deltas[(int)d];
                    if (!_map.ContainsKey(candidatePosition))
                    {
                        Status status = (Status) await sendCommand(d);

                        if (status != Status.Wall)
                        {
                            _map.Add(candidatePosition, status);
                            if (status == Status.Oxygen)
                            {
                                _oxygen = candidatePosition;
                            }

                            await backtrackHelper(candidatePosition);
                            await sendCommand(s_opposites[(int)d]);
                        }
                    }
                }
            }

            Task.Run(() => backtrackHelper(IntVec2.Zero)).Wait();
        }
コード例 #20
0
        public async static void Run(string slidesQuery, string size, Action <string> action, CancellationToken token)
        {
            if (string.IsNullOrWhiteSpace(slidesQuery))
            {
                return;
            }

            var inputQueries = new AsyncQueue <string>();

            slidesQuery.Split('\n').ToList().ForEach(query => inputQueries.Enqueue(query));
            inputQueries.SetFinished();
            var outputURLs = new AsyncQueue <List <string> >();

            AsyncHelper.RunTasks(inputQueries, query => GetSlideURLs(query, size, token), outputURLs, token);

            var urls = new List <string>();

            while (await outputURLs.HasItemsAsync(token))
            {
                foreach (var item in outputURLs.Dequeue())
                {
                    urls.Add(item);
                }
            }

            var random = new Random();

            urls = urls.OrderBy(x => random.Next()).ToList();

            var inputURLs = new AsyncQueue <string>();

            urls.ForEach(url => inputURLs.Enqueue(url));
            inputURLs.SetFinished();

            SlideDownloader.Run(inputURLs, action, token);
        }
コード例 #21
0
        private async Task ExtMethodQueueTestAsync()
        {
            AsyncQueue<string> q = new AsyncQueue<string>(5);

            Func<Task> producer = async delegate ()
            {
                #region

                for (int i = 0; i < 20; ++i)
                {
                    System.Diagnostics.Debug.WriteLine($"Writing {i}...");
                    await q.Enqueue($"Value: {i}", CancellationToken.None);
                }

                System.Diagnostics.Debug.WriteLine("Writing EOF...");

                q.WriteEof();

                #endregion
            };

            Func<Task> consumer = async delegate ()
            {
                #region

                bool more = true;
                while (more)
                {
                    System.Diagnostics.Debug.WriteLine("Reading...");
                    Option<string> ostr = await q.Dequeue(CancellationToken.None);

                    if (ostr.HasValue)
                    {
                        System.Diagnostics.Debug.WriteLine($"Read {ostr.Value}");
                    }
                    else
                    {
                        System.Diagnostics.Debug.WriteLine("Read EOF...");
                        more = false;
                    }

                }

                #endregion
            };

            Task tProducer = Task.Run(producer);
            Task tConsumer = Task.Run(consumer);

            await Task.WhenAll(tProducer, tConsumer);
        }
コード例 #22
0
        public async Task <IEnumerable <FtpEntry> > ListFilesRecursiveAsync(string startPath = null, Predicate <FtpEntry> skipFolder = null, CancellationToken ctk = default)
        {
            startPath = startPath ?? "./";

            if (skipFolder == null)
            {
                skipFolder = x => false;
            }

            List <Task <IEnumerable <FtpEntry> > > pending = new List <Task <IEnumerable <FtpEntry> > >();
            IEnumerable <FtpEntry> files = new List <FtpEntry>();

            using (var d = new DisposableContainer())
            {
                var clientsQueue = new AsyncQueue <FluentFTP.IFtpClient>(5);
                for (int i = 0; i < 5; i++)
                {
                    var c = _getClient();
                    d.Add(c);
                    await clientsQueue.Enqueue(c, ctk);
                }

                Func <string, CancellationToken, Task <IEnumerable <FtpEntry> > > listFolderAsync = async(string path, CancellationToken ct) =>
                {
                    var c = await clientsQueue.Dequeue(ct);

                    try
                    {
                        var retrier = Policy
                                      .Handle <Exception>()
                                      .WaitAndRetryAsync(new[]
                        {
                            TimeSpan.FromSeconds(1),
                            TimeSpan.FromSeconds(5),
                            TimeSpan.FromSeconds(15)
                        }, (ex, ts) =>
                        {
                            _logger.Warn(ex, "Failed to list folder {0}. Try again soon ...", path);
                        });
                        var res = await retrier.ExecuteAsync(ct1 =>
                        {
                            return(c.Value.GetListingAsync(path));
                        }, ct).ConfigureAwait(false);

                        return(res.Select(x => new FtpEntry()
                        {
                            FullPath = x.FullName,
                            IsDirectory = x.Type == FtpFileSystemObjectType.Directory,
                            Modified = x.Modified,
                            Name = x.Name,
                            Size = x.Size
                        }).ToList());
                    } finally
                    {
                        await clientsQueue.Enqueue(c.Value, ct);
                    }
                };

                pending.Add(listFolderAsync(startPath, ctk));

                while (pending.Count > 0 && !ctk.IsCancellationRequested)
                {
                    var completedTask = await Task.WhenAny(pending).ConfigureAwait(false);

                    pending.Remove(completedTask);

                    // task could have completed with errors ... strange, let them progate.
                    var list = await completedTask.ConfigureAwait(false);

                    //we want to exclude folders . and .. that we dont want to search
                    foreach (var dir in list.Where(x => x.IsDirectory && !x.Name.Equals(".") && !x.Name.Equals("..")))
                    {
                        if (skipFolder.Invoke(dir))
                        {
                            _logger.Debug("Skipping folder: {0}", dir.FullPath);
                        }
                        else
                        {
                            pending.Add(listFolderAsync(dir.FullPath, ctk));
                        }
                    }

                    files = files.Concat(list.Where(x => !x.IsDirectory));
                }

                ctk.ThrowIfCancellationRequested();

                return(files.ToList());
            }
        }