У меня есть несколько очков для вас:
Вы можете повысить эффективность, избавившись от одной лишней задачи за отправку:
public static Task<int> SendAsync(this Socket socket, byte[] buffer, int offset, int count)
{
return Task.Factory.FromAsync<int>(
socket.BeginSend(buffer, offset, count, SocketFlags.None, null, socket),
socket.EndSend);
//Don't explicitly start the return value of this method. The task will already be started.
}
Вы используете асинхронную отправку, насколько ямогу сказать (кроме ненужной задачи).
Используете ли вы UDP?Если да, это объясняет, почему некоторые данные отсутствуют.
Есть ли обнаруженная ошибка?Если да, цикл будет прерван, и не все клиенты получат свои данные.
У вас есть условие гонки:
int totalConnectedClients = connectedClients.Count;
Это должно происходить внутри блокировки.Вы не можете безопасно считать счетчик, в то время как другие темы могут обновить этот словарь.
Как вы получаете данные?Возможно ошибка находится на стороне приема.Пожалуйста, отправьте код.
Редактировать:
Что делать, если запущены два одновременных приема?Это может привести к ошибке: клиенты могут получать сначала самые новые данные, а затем более старые данные.Я рекомендую вам не начинать новый поток каждый раз, когда вы получаете данные.Вместо этого, постоянно работающий поток, который извлекает новые данные из коллекции BlockingCollection с помощью метода GetConsumerEnumerable.Ваш метод newDataReceived будет просто помещен в эту коллекцию BlockingCollection.Вы можете найти отличное введение здесь: http://blogs.msdn.com/b/csharpfaq/archive/2010/08/12/blocking-collection-and-the-producer-consumer-problem.aspx