TcpClient Очередь или могопоточность - C#
Формулировка задачи:
Здравствуйте... Я уже было дело - делал тему о своём нетворк фреймворке, и он теории в небольших объемах справляется. Но вот при более больших объемах - научились проблемы. И я даже не знаю в чем именно.
1. Это при отключении конекта при исполнении хука OnDisconnect порой ошибка внутри о том что поток находился на стадии уничтожения.
2. Переодические проблемы с логом в файл, он переодически писал что файл занят другим процессом(Да, да, да. Каждое действие от каждого юзера это отдельный File.AppendAllText)
3. Откудато сейчас появилась проблема что раз в Nое время сервер начинает кушать не как раньше - мение 1% а начинает кушать все 100% с учетом что стоит 2 процессора на сервеной машине по 8 ядер.
Сам фреймворк работает по такому принцепу.
Создается while(true) в котором принмаются клиенты, и при подключении нового клиента я создаю поток с этим клиентом и там же обьявляю все данные пользователя и создаю новый поток под StreamReader.ReadLine тоже в While(true). Как только появляется запрос - я для него создаю новый поток и там уже вызываю хук OnPacket. А сам дальше проверяю новые запросы.
Кто что может посоветовать? Или структуру в кратце новую описать для TCP сервера. Завтра начну с переписывания фреймворка скорее всего =(
Решение задачи: «TcpClient Очередь или могопоточность»
textual
Листинг программы
public static void Log(string str, string type = "text") { switch (type) { case "info": Console.ForegroundColor = ConsoleColor.Blue; break; case "warning": Console.ForegroundColor = ConsoleColor.Yellow; break; case "error": Console.ForegroundColor = ConsoleColor.Red; break; case "success": Console.ForegroundColor = ConsoleColor.Green; break; } var text = "[" + DateTime.Now.ToString("HH:mm:ss fff") + "]: " + str; Console.WriteLine(text); // Формируем дату и тут же отправляем в консоль дату с текстом try { if (Application._Config.ContainsKey("log.tofile") && Application._Config["log.tofile"] == "1" && Application._Config.ContainsKey("log.file")) { File.AppendAllText("./Data/Logs/" + Application._Config["log.file"].Replace("{d}", DateTime.Now.Day.ToString()).Replace("{m}", DateTime.Now.Month.ToString()).Replace("{y}", DateTime.Now.Year.ToString()), "\r\n" + text); } } catch (Exception ex) { type = "error"; Console.ForegroundColor = ConsoleColor.Red; text = "[" + DateTime.Now.ToString("HH:mm:ss fff") + "]: Нагрузка, ну просто ахуеть! Строка не залогировалась."; Console.WriteLine(text); } if (type != "text") Console.ResetColor(); // Если мы меняли цвет то возвращаем его обратно }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д