예제 #1
0
        public static async Task AddRemoveParticipant()
        {
            for (var j = 0; j < 100; j++)
            {
                using (var barrier = new AsyncBarrier(0))
                {
                    var actions = new Action[4];
                    for (int k = 0; k < 4; k++)
                    {
                        actions[k] = () =>
                        {
                            for (int i = 0; i < 400; i++)
                            {
                                barrier.AddParticipant();
                                barrier.RemoveParticipant();
                            }
                        };
                    }

                    var tasks = new Task[actions.Length];
                    for (var k = 0; k < tasks.Length; k++)
                    {
                        tasks[k] = Task.Factory.StartNew(index => actions[Convert.ToInt32(index)](), k, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default);
                    }
                    await Task.WhenAll(tasks);

                    Assert.Equal(0, barrier.ParticipantCount);
                }
            }
        }
예제 #2
0
        public static async Task RemovingWaitingParticipants()
        {
            using var barrier = new AsyncBarrier(4);
            var task = barrier.SignalAndWaitAsync();

            while (barrier.ParticipantsRemaining > 3)
            {
                await Task.Delay(100);
            }
            barrier.RemoveParticipants(2);
            Equal(1, barrier.ParticipantsRemaining);
            Throws <ArgumentOutOfRangeException>(() => barrier.RemoveParticipants(20));
            Equal(1, barrier.ParticipantsRemaining);
            barrier.RemoveParticipant();
            Equal(0, barrier.ParticipantsRemaining);
        }