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(); // Если мы меняли цвет то возвращаем его обратно
}