private async Task BatchChanges() { var buffer = new BufferBlock <AssemblyChangedEvent>(); using (AssemblyChangedBroadcast.LinkTo(buffer)) { while (true) { var hasChanged = false; var assemblyChanges = new List <AssemblyChangedEvent>(); do { var assemblyChange = await buffer.ReceiveAsync(batchChangesCancellationTokenSource.Token); if (assemblyChange != null) { assemblyChanges.Add(assemblyChange); } if (assemblyChange != null && !hasChanged) { // After the first change, wait for more changes await Task.Delay(TimeSpan.FromMilliseconds(500), batchChangesCancellationTokenSource.Token); hasChanged = true; } } while (!hasChanged || buffer.Count > 0); // Merge files that were modified multiple time assemblyChanges = assemblyChanges.GroupBy(x => x.ChangedFile).Select(x => x.Last()).ToList(); AssembliesChangedBroadcast.Post(assemblyChanges); } } }
public async Task ReceiveAndDiscardChanges(TimeSpan batchInterval, CancellationToken cancellationToken) { var hasChanged = false; var buffer = new BufferBlock <AssemblyChangedEvent>(); using (AssemblyChangedBroadcast.LinkTo(buffer)) { do { var assemblyChange = await buffer.ReceiveAsync(cancellationToken); if (assemblyChange != null && !hasChanged) { // After the first change, wait for more changes await Task.Delay(batchInterval, cancellationToken); hasChanged = true; } } while (!hasChanged || fileChanged.Count > 0); } }