private bool MoveNext() { TSource item; if (_enumerator == null) { return(false); } lock (_enumerator) { if (!_enumerator.MoveNext()) { _enumerator.Dispose(); _cancellationTokenSource.Cancel(); _enumerator = null; return(false); } item = _enumerator.Current; } var key = _keySelector(item); var element = _resultSelector(item); if (_proxies.TryGetOrAdd(key, _ => new ProxyObservable <TElement>(), out var proxy)) { var progressor = Progressor <TElement> .CreateFromIObservable ( proxy, Advance, _cancellationTokenSource.Token ); var items = ProgressiveCollection <TElement> .Create ( progressor, new ThreadSafeCollection <TElement>(), EqualityComparer <TElement> .Default ); var result = new Grouping <TKey, TElement>(key, items); _results.Add(result); } proxy.OnNext(element); return(true); }