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); } } }
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); }