public void Process() { Stream = tcpClient.GetStream(); Console.WriteLine("Клиент с номером потока {0} - подключился", ThreadNumber); File.AppendAllText(path, "Клиент с номером потока " + ThreadNumber + " - подключился\n"); string oldMessage = null; while (true) { try { if (ClientNumber <= 2) { string newMessage = GetMessage(Stream); if (MessagesInProcces.Any(m => m == newMessage)) { string attention = "Данный запрос уже находится в обработке!"; SendMessage(attention, Stream); if (ClientWithDublet.All(c => c.Item2 != newMessage)) { ClientWithDublet.Add(new Tuple <Client, string>(this, newMessage)); } } else { if (serverIsBusy) { string attention = "Запрос уже обрабатывается!"; SendMessage(attention, Stream); } else { oldMessage = newMessage; ProcessingMessage(oldMessage, Stream); oldMessage = null; } } } else { GetMessage(Stream); SendMessage("Превышен лимит потоков, попробуйте позже", Stream); } } catch (Exception ex) { Console.WriteLine("Клиент с номером потока {0} - отключился", ThreadNumber); File.AppendAllText(path, "Клиент с номером потока " + ThreadNumber + " - отключился\n"); Clients.Remove(this); for (int i = 0; i < Clients.Count; i++) { Clients[i].ClientNumber = i; } return; } } }
async void ProcessingMessage(string message, NetworkStream stream) { await Task.Run(() => { serverIsBusy = true; MessagesInProcces.Add(message); Thread.Sleep(5000); var answer = Answers[random.Next(3)]; string fullAnswer = DateTime.Now.ToShortTimeString() + ": " + answer + message; Console.WriteLine("Номер клиeнта {0}, " + fullAnswer, ThreadNumber); SendMessage(fullAnswer, stream); var clients = ClientWithDublet.Where(c => c.Item2 == message); var clientNumbers = clients.Select(c => c.Item1); foreach (var clientWithDuplet in clientNumbers) { var client = Clients.FirstOrDefault(c => c.ClientNumber == clientWithDuplet.ClientNumber); if (client == null) { continue; } Console.WriteLine("Номер клиeнта {0}, " + fullAnswer, client.ThreadNumber); } clients.Distinct(); foreach (var clientWithDuplet in clients.ToList()) { SendMessage(fullAnswer, clientWithDuplet.Item1.Stream); ClientWithDublet.Remove(clientWithDuplet); } MessagesInProcces.Remove(message); serverIsBusy = false; }); }