Exemplo n.º 1
0
        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);
                }
            }
        }
Exemplo n.º 2
0
        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);
            }
        }