public void Send() { var allEndpoints = new ThreadSafeSet <Endpoint>(); while (_continueSending) { if (!_choke.ShouldBeginSend()) { continue; } var endpoints = gatherEndpoints(allEndpoints.All()).ToArray(); if (!endpoints.Any()) { _choke.NoMessagesToSend(); continue; } allEndpoints.Add(endpoints); endpoints.Each(endpoint => { var messages = gatherMessagesToSend(endpoint); if (!messages.Any()) { allEndpoints.Remove(endpoint); return; } _choke.StartSend(); sendMessages(endpoint, messages) .ContinueWith(x => allEndpoints.Remove(endpoint)); }); } }