Sockets IRC sur émulateur de jeu en c#

Signaler
Messages postés
6
Date d'inscription
samedi 27 mars 2010
Statut
Membre
Dernière intervention
17 février 2013
-
Messages postés
6
Date d'inscription
samedi 27 mars 2010
Statut
Membre
Dernière intervention
17 février 2013
-
Bonjour à tous,

après je ne sais combien d'heures de codage sur un programme de jeu développé en c# qui accueil tous les jours environ 1000/1500 utilisateurs, j'ai pu constater que cela ramait beaucoup.

Je tiens à préciser que ce qu'est sensé être le jeu tournant sur cet émulateur ne regarde personne et que les commentaires démesurés ne seront pas les bienvenus (je fais référence à un forum qui a fait des commentaires inutiles et très désagréable dont je ne citerai pas le nom, disant je ne sais trop quoi n'étant pas en rapport avec le problème à suivre). Ce n'est pas un émulateur prévu pour pirater quoi que ce soit, ni pour faire exploser l'univers.

Je m'explique :

moi et mon équipe avons développé un émulateur pour un jeu, un serveur quoi, et nous souhaitons gérer la modération des propos des utilisateurs et toute la gestion du jeu via des serveurs irc.

Lorsqu'un utilisateur se connecte au jeu, il est sans le savoir par le biais de l'émulateur (qui ouvre une socket pour l'utilisateur) connecté également sur un serveur irc (UnrealIRCd). C'est grâce à ça que sont publiés les nombreux propos des utilisateurs sur des salons privés du serveur IRC. Nous les modérons en les kickant, bannissant du serveur IRC ce qui provoque le même effet sur le jeu.

Sauf que, hier en officialisant cette fonction, au bout d'un certain nombre de connectés au jeu et donc d'un certain nombre de sockets ouvertes par le programme en c# (l'émulateur) je me suis aperçu que cela laguait énormément voire que le jeu devenait impossible à accéder.

Il est possible que ça vienne du "Threading". Voici la page concernée :


using System;
using System.Collections.Generic;
using System.Linq;
using System.Collections;
using System.Text;
using System.Net.Sockets;
using System.IO;
using System.Threading.Tasks;
using System.Threading;
using Butterfly.userHotel.GameClients;
using Butterfly.userHotel.Rooms;
using Butterfly.userHotel.Navigators;
using Butterfly.userHotel.Rooms.RoomIvokedItems;
using Butterfly.userHotel.ChatMessageStorage;
using Butterfly.Core;
using Butterfly.Messages;
using userEvents;
using Database_Manager.Database.Session_Details.Interfaces;
using Uber.userHotel.Rooms;


namespace Butterfly.IRC
{
struct IRCConfig
{
public uint userID;
public string server;
public int port;
public string nick;
public string name;
public int channel;
public bool isarealBot;

}

class IRCBot
{
TcpClient IRCConnection = null;
IRCConfig config;
NetworkStream ns = null;
StreamReader sr = null;
StreamWriter sw = null;
Thread IRCThread;




public IRCBot(IRCConfig config)
{

IRCConnection = new TcpClient(config.server, config.port);
ns = IRCConnection.GetStream();


this.sr = new StreamReader(ns);
this.sw = new StreamWriter(ns, System.Text.Encoding.GetEncoding("iso-8859-1"));
this.config = config;

//Thread IRC en background
this.IRCThread = new Thread(new ThreadStart(CallbackThread));
IRCThread.IsBackground = true;
IRCThread.Start();


}

//internal void Start()
//{
// IRCLooper.Start();
//}

public void AddAccess(string nick)
{
using (IQueryAdapter dbClient = ButterflyEnvironment.GetDatabaseManager().getQueryreactor())
{
dbClient.runFastQuery("INSERT INTO access (allow) VALUES('" + nick + "')");
}
}

public void DelAccess(string nick)
{
if (nick.Contains("[absent]")) { nick = nick.Replace("[absent]", ""); }
if (nick.Contains("[absente]")) { nick = nick.Replace("[absente]", ""); }
if (nick.Contains("[occupe]")) { nick = nick.Replace("[occupe]", ""); }
if (nick.Contains("[occupee]")) { nick = nick.Replace("[occupee]", ""); }
using (IQueryAdapter dbClient = ButterflyEnvironment.GetDatabaseManager().getQueryreactor())
{
dbClient.runFastQuery("DELETE FROM access WHERE `allow` = '" + nick + "'");
}
try
{
ButterflyEnvironment.GetGame().GetClientManager().GetClientByUsername(nick).Disconnect();
}
catch
{ }
}

public void sendData(string cmd, string param)
{
if (param == null)
{
sw.WriteLine(cmd);
sw.Flush();
// Console.WriteLine(cmd);
}
else
{
sw.WriteLine(cmd + " " + param);
sw.Flush();
// Console.WriteLine(cmd + " " + param);
}
}

public void IRCWork()
{
string[] ex;
string data;
bool shouldRun = true;
while (shouldRun)
{
data = sr.ReadLine();
Console.WriteLine(data);
char[] charSeparator = new char[] { ' ' };
ex = data.Split(charSeparator, 5);


if (ex[0] == "PING")
{
sendData("PONG", ex[1]);
}

/*
* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
* BETABOT
* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
*/

if (config.isarealBot)
{
/*
* DETECTION DE LA REPONSE DE BIENVENUE DE L'IRCD
*/
if (ex[1] == "001")
{
sendData("PRIVMSG", "NickServ IDENTIFY ***");
sendData("OPER", "Bot ***");
sendData("MODE", "BetaBot +BiT-s");
sendData("JOIN", "#headquarter");
sendData("MODE", "#headquarter +ao BetaBot BetaBot");
sendData("JOIN", "#opers");
sendData("MODE", "#opers +ao BetaBot BetaBot");
sendData("JOIN", "#admins");
sendData("MODE", "#admins +ao BetaBot BetaBot");
}

/*
* MESSAGES
*/
if (ex[1] == "KICK")
{
string chan = ex[2];
string nick = ex[3];
if (chan == "#headquarter")
DelAccess(nick);
}
if (ex[1] == "QUIT")
{
string nick = ex[0].Substring(1, ex[0].Substring(1).IndexOf("!"));
DelAccess(nick);
}
if (ex[1] == "PART")
{
string nick = ex[0].Substring(1, ex[0].Substring(1).IndexOf("!"));
string chan = ex[2];
if (chan == "#headquarter")
DelAccess(nick);
}
if (ex[1] == "JOIN")
{
string nick = ex[0].Substring(1, ex[0].Substring(1).IndexOf("!"));
string chan = ex[2].Substring(1);
if (chan == "#headquarter")
{
AddAccess(nick);
try
{
uint Rank;
using (IQueryAdapter dbClient = ButterflyEnvironment.GetDatabaseManager().getQueryreactor())
{
dbClient.setQuery("SELECT rank FROM users WHERE username = '" + nick+ "'");
Rank = (uint)(dbClient.getInteger());
}
if (Rank == 9)
{
sendData("MODE", chan + " +ao " + nick + " " + nick);
}
else if (Rank == 8)
{
sendData("MODE", chan + " +ao " + nick + " " + nick);
}
else if (Rank == 7)
{
sendData("MODE", chan + " +o " + nick);
}
else if (Rank == 6)
{
sendData("MODE", chan + " +h " + nick);
}
}
catch
{
break;
}
}
}
if (ex[1] == "PRIVMSG")
{
// Récup de trigger :
string trigger = ex[0].Substring(1, ex[0].Substring(1).IndexOf("!"));

// :HELP
if (ex[3] == ":HELP")
{
sendData("NOTICE", trigger + " " + (char)2 + "Liste des commandes d'aide :");
sendData("NOTICE", trigger + " " + (char)2);
sendData("NOTICE", trigger + " " + "SUSPEND Effectue un roomkick sur les utilisateurs de l'appartement et le ferme");
sendData("NOTICE", trigger + " " + "BANUSER Bannie pour secondes avec la ");
sendData("NOTICE", trigger + " " + "BANIP Bannie pour secondes avec la ");
sendData("NOTICE", trigger + " " + "UNBAN Débannie de l'hôtel");
sendData("NOTICE", trigger + " " + "HOTELALERT Envoie le à tout l'hôtel");
sendData("NOTICE", trigger + " " + "HOTELALINK Envoie le à tout l'hôtel avec l'");
sendData("NOTICE", trigger + " " + "ADDBADGE Envoie le à ");
sendData("NOTICE", trigger + " " + "REMBADGE Retire le à ");
}
// SUSPEND
else if (ex[3] == ":SUSPEND")
{
try
{
uint room = Convert.ToUInt32(ex[4].ToString());
Room Room = ButterflyEnvironment.GetGame().GetRoomManager().GetRoom(room);
if (Room == null)
{
sendData("NOTICE", trigger + " " + "La room avec l'id " + room + " n'existe pas.");
}
else
{
Room.State = 1;
Room.Name = "Inacceptable pour le management";
Room.Description = "Inacceptable pour le management";
Room.ClearTags();
using (IQueryAdapter dbClient = ButterflyEnvironment.GetDatabaseManager().getQueryreactor())
{
dbClient.runFastQuery("UPDATE rooms SET caption 'Inacceptable pour le management', description 'Inacceptable pour le management', state = '1', tags = '' WHERE id = " + Room.RoomId + "");
}
Room.RoomMuted = true;
string Msg = "Cet appartement a été suspendu car il ne respecte pas les conditions générales d'utilisation. Il sera fermé et plus personne ne pourra parler à l'interieur.";
Msg = Msg.ToString();
ServerMessage nMessage = new ServerMessage();
nMessage.Init(Outgoing.SendNotif);
nMessage.AppendString(Msg);
nMessage.AppendString("");
Room.SendMessage(nMessage);
GameClient User = ButterflyEnvironment.GetGame().GetClientManager().GetClientByUsername(Room.Owner);
ButterflyEnvironment.GetGame().GetBanManager().BanUser(User, "system", 3600, "Nom d'appartement inacceptable", false);
sendData("PRIVMSG", "#headquarter -RoomSuspended- L'appart " + room + " a été suspendu par " + trigger);
}
}
catch
{
sendData("NOTICE", trigger + " " + "Syntaxe: /MSG BetaBot SUSPEND ");
}
}
// BANUSER
if (ex[3] == ":BANUSER")
{
try
{
string[] args;
char[] charSeparators = new char[] { ' ' };
args = ex[4].Split(charSeparators, 3);
string target = args[0];
string reason = args[2];
double during = Convert.ToDouble(args[1].ToString());
GameClient User = ButterflyEnvironment.GetGame().GetClientManager().GetClientByUsername(target);
ButterflyEnvironment.GetGame().GetBanManager().BanUser(User, trigger, during, reason, false);
ButterflyEnvironment.GetGame().GetBanManager().BanUser(User, trigger, during, reason, false);
sendData("NOTICE", trigger + " " + "Cible du BAN : " + target);
sendData("NOTICE", trigger + " " + "Auteur du BAN : " + trigger);
sendData("NOTICE", trigger + " " + "Durée du BAN : " + during);
sendData("NOTICE", trigger + " " + "Description du BAN : " + reason);
sendData("NOTICE", trigger + " " + "Type du BAN : USER");
}
catch
{
sendData("NOTICE", trigger + " " + "L'utilisateur est hors ligne.");
}
}
// BANIP
if (ex[3] == ":BANIP")
{
try
{
string[] args;
char[] charSeparators = new char[] { ' ' };
args = ex[4].Split(charSeparators, 3);
string target = args[0];
string reason = args[2];
double during = Convert.ToDouble(args[1].ToString());
GameClient User = ButterflyEnvironment.GetGame().GetClientManager().GetClientByUsername(target);
ButterflyEnvironment.GetGame().GetBanManager().BanUser(User, trigger, during, reason, true);
sendData("NOTICE", trigger + " " + "Cible du BAN : " + target);
sendData("NOTICE", trigger + " " + "Auteur du BAN : " + trigger);
sendData("NOTICE", trigger + " " + "Durée du BAN : " + during);
sendData("NOTICE", trigger + " " + "Description du BAN : " + reason);
sendData("NOTICE", trigger + " " + "Type du BAN : IP");
}
catch
{
sendData("NOTICE", trigger + " " + "L'utilisateur est hors ligne.");
}
}
// UNBAN
if (ex[3] == ":UNBAN")
{
try
{
ButterflyEnvironment.GetGame().GetBanManager().UnbanUser(ex[4]);
sendData("NOTICE", trigger + " " + "L'utilisateur / L'utilisatrice indiqué a été débanni(e).");
}
catch
{
sendData("NOTICE", trigger + " " + "Syntaxe: /MSG BetaBot UNBAN ");
}
}
// HOTELALERT
if (ex[3] == ":HOTELALERT")
{
try
{
string Notice = ex[4];
ServerMessage HotelAlert = new ServerMessage(Outgoing.BroadcastMessage);
HotelAlert.AppendStringWithBreak(LanguageLocale.GetValue("hotelallert.notice") + "\r\n" + Notice + "\r\r- " + trigger);
ButterflyEnvironment.GetGame().GetClientManager().QueueBroadcaseMessage(HotelAlert);
sendData("NOTICE", trigger + " " + "Hôtel alerte envoyée.");
}
catch
{
sendData("NOTICE", trigger + " " + "Une erreur s'est produite pendant l'envoit de l'hotelalert.");
}
}
// HOTELALINK
if (ex[3] == ":HOTELALINK")
{
string Link = ex[4].Substring(0, ex[4].IndexOf(" "));

string Message = ex[4].Replace(Link, "");

ServerMessage nMessage = new ServerMessage(Outgoing.SendNotif);
nMessage.AppendStringWithBreak(LanguageLocale.GetValue("hotelallert.notice") + "\r\n" + Message);
nMessage.AppendStringWithBreak(Link);
ButterflyEnvironment.GetGame().GetClientManager().QueueBroadcaseMessage(nMessage);

}
// ADDBADGE
if (ex[3] == ":ADDBADGE")
{
string target = ex[4].Substring(0, ex[4].IndexOf(" "));
string badge = ex[4].Replace(target, "");

userHotel.Users.user user = ButterflyEnvironment.getuserForName(target);
if (user != null)
{
if (!user.GetBadgeComponent().HasBadge(badge))
{
user.GetBadgeComponent().GiveBadge(ButterflyEnvironment.FilterInjectionChars(badge), true);
sendData("NOTICE", trigger + " Le badge a bien été ajouté.");
}
else { sendData("NOTICE", trigger + " Cet utilisateur a déjà ce badge."); }
}

}
// REMBADGE
if (ex[3] == ":REMBADGE")
{
string target = ex[4].Substring(0, ex[4].IndexOf(" "));
string badge = ex[4].Replace(target, "");

userHotel.Users.user user = ButterflyEnvironment.getuserForName(target);

uint userid = user.Id;
using (IQueryAdapter dbClient = ButterflyEnvironment.GetDatabaseManager().getQueryreactor())
{
dbClient.runFastQuery("DELETE FROM user_badges WHERE `user_id` '" + userid + "' AND `badge_id` '" + badge + "'");
sendData("NOTICE", trigger + " Le badge a bien été retiré.");
}
}

}
}

/*
* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
* USER
* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
*/

else
{
/*
* DETECTION DE LA REPONSE DE BIENVENUE DE L'IRCD
*/
if (ex[1] == "001")
{
GameClient user = ButterflyEnvironment.GetGame().GetClientManager().GetClientByUserID(config.userID);
sendData("JOIN", "#monitori_" + config.channel);
sendData("PRIVMSG", "#monitori_" + config.channel + " New connection");
sendData("AWAY", user.Getuser().Motto);
}
/*
* DETECTION D'UN PRIVMSG
*
*
*/
if (ex[1] == "PRIVMSG")
{
}

/*
* DETECTION DU RAW 404
* Dans le cas où l'utilisateur reçois ce message, c'est qu'il est ban quiet du salon où il se trouve
* Ce qui correspond à un "mute" sur l'hôtel.
* On procède alors à une vérification : si le user n'est est encore mute, on execute la commande demute.
*/
if (ex[1] == "404")
{
GameClient user = ButterflyEnvironment.GetGame().GetClientManager().GetClientByUserID(config.userID);
if (!user.Getuser().Muted)
{
user.Getuser().Muted = true;
}
}
/*
* DETECTION DU MODE +b ~q:
* Dans le cas où l'utilisateur reçois ce message, c'est qu'il est ban quiet du salon où il se trouve
* Ce qui correspond à un "silence" sur l'hôtel.
* On procède alors à une vérification : si le user n'est pas encore mute, on execute la commande de mute.
*/
if (ex[1] == "MODE" && ex[2].IndexOf("#") != -1 && ex[3].Contains("+b"))
{
if (data.Contains("~q:" + config.nick))
{
GameClient user = ButterflyEnvironment.GetGame().GetClientManager().GetClientByUserID(config.userID);
if (!user.Getuser().Muted)
{
user.Getuser().Muted = true;
}
if (user.Getuser().CurrentRoomId != 0)
{
Room Room = ButterflyEnvironment.GetGame().GetRoomManager().GetRoom(user.Getuser().CurrentRoomId);
Room.AddBan(user.Getuser().Id);
Room.GetRoomUserManager().RemoveUserFromRoom(user, true, false);
}
}
}
if (ex[1] == "MODE" && ex[2].IndexOf("#") != -1 && ex[3].Contains("-b"))
{
if (data.Contains("~q:" + config.nick))
{
GameClient user = ButterflyEnvironment.GetGame().GetClientManager().GetClientByUserID(config.userID);
if (user.Getuser().Muted)
{
user.Getuser().Muted = false;
}
}
}
/*
* DETECTION DU MODE +m
* Dans le cas où l'utilisateur reçois ce message, c'est qu'il est mute du salon où il se trouve.
* Ce qui correspond à une maintenance "silence" sur l'hôtel.
* On procède alors à une vérification : si le user n'est pas encore mute, on execute la commande de mute.
*/
if (ex[1] == "MODE" && ex[2].IndexOf("#") != -1 && ex[3].Contains("+m"))
{
GameClient user = ButterflyEnvironment.GetGame().GetClientManager().GetClientByUserID(config.userID);
if (!user.Getuser().Muted)
{
user.Getuser().Muted = true;
}
}
if (ex[1] == "MODE" && ex[2].IndexOf("#") != -1 && ex[3].Contains("-m"))
{
GameClient user = ButterflyEnvironment.GetGame().GetClientManager().GetClientByUserID(config.userID);
if (user.Getuser().Muted)
{
user.Getuser().Muted = false;
}
}
/*
* DETECTION DU MODE +e
* Dans le cas où l'utilisateur reçois ce message, c'est qu'il est dans la liste des excpetions du salon où il se trouve
* Ce qui correspond à un "bloque d'appart" sur l'hôtel.
* On procède alors à une vérification : le user est bloqué de l'appart où il est, on execute la commande de bloquage.
*/
if (ex[1] == "MODE" && ex[2].IndexOf("#") != -1 && ex[3].Contains("+e") && ex[4].Contains(config.nick))
{
GameClient user = ButterflyEnvironment.GetGame().GetClientManager().GetClientByUserID(config.userID);
if (user.Getuser().CurrentRoomId != 0)
{
Room Room = ButterflyEnvironment.GetGame().GetRoomManager().GetRoom(user.Getuser().CurrentRoomId);
Room.AddBan(user.Getuser().Id);
Room.GetRoomUserManager().RemoveUserFromRoom(user, true, false);

}
}
/*
* DETECTION DU KICK
* On cherche à savoir si le kick est destiné à l'utilisateur actif. Si c'est le cas :
* On envoit un message indiquant à l'utilisateur le motif de l'exclusion du salon (qui le kickera donc de l'appart où il est)
*/
if (ex[1] == "KICK" && ex[3] == config.nick)
{
string desc = ex[4].Substring(1);
GameClient user = ButterflyEnvironment.GetGame().GetClientManager().GetClientByUserID(config.userID);
sendData("JOIN", ex[2]);
if (user.Getuser().CurrentRoomId != 0)
{
user.Getuser().CurrentRoom.GetRoomUserManager().RemoveUserFromRoom(user, true, false);
user.SendNotif("Tu as été kické(e) de l'appart par un modérateur (" + desc + ")");
}
else
{
user.SendNotif("Ceci est un avertissement de la part d'un modérateur (" + desc + ")");
}
}
/*
* DETECTION D'UNE NOTICE
* Lors de la détection d'une notice, si elle n'est pas une notice d'identification et qu'elle ne provient pas du serveur,
* elle est alors affiché comme message "important" sur le client de l'utilisateur concerné.
*/
if (ex[1] == "NOTICE" && ex[2] != "AUTH" && !ex[0].Contains("userbeta.co"))
{
try
{
// Return content
string content = ex[3].Substring(1) + " " + ex[4];
// Execute command on hotel
GameClient user = ButterflyEnvironment.GetGame().GetClientManager().GetClientByUserID(config.userID);
user.SendBroadcastMessage(content);
}
catch
{
break;
}
}
/*
* DETECTION D'UN KILL
* Si un kill intervient sur le pseudo irc de l'utilisateur, il est automatiquement déconnecté de l'hôtel
* Il en va de même pour tout les messages d'erreur provenant de l'ircd, pouvant entrainer la déconnexion de l'utilisateur du
* serveur irc, empêchant ainsi tout traitement des messages irc sur le client de l'utilisateur, il devra donc se reconnecter.
*/
if (ex[0].Contains("ERROR"))
{
ButterflyEnvironment.GetGame().GetClientManager().GetClientByUserID(config.userID).Disconnect();
}
}
}
}

public void SayMessage(string msg, bool Shout, bool Whisper, int channel)
{
// PRIVMSG #salon :Message
// byte[] utf8Bytes = Encoding.UTF8.GetBytes(msg);

GameClient user = ButterflyEnvironment.GetGame().GetClientManager().GetClientByUserID(config.userID);
if (!user.Getuser().Muted)
{
if (Shout)
sendData("PRIVMSG", "#monitori_" + channel + " :" + (char)2 + msg + (char)2);
else if (Whisper)
sendData("PRIVMSG", "#monitori_" + channel + " :" + (char)29 + msg + (char)29);
else
sendData("PRIVMSG", "#monitori_" + channel + " :" + msg);
}
}

public void Destroy()
{
//Destroy ALL

if (IRCThread != null)
{
IRCThread.Abort();
GC.SuppressFinalize(IRCThread);
}

if (sr != null)
sr.Close();
if (sw != null)
sw.Close();
if (ns != null)
ns.Close();
if (IRCConnection != null)
IRCConnection.Close();

sr = null;
sw = null;
ns = null;
IRCConnection = null;
IRCThread = null;

}

public void CallbackThread()
{
try
{
sendData("USER", config.name);
sendData("NICK", config.nick);

//Lets go funny raws
IRCWork();

}
catch
{
//Logging.WriteLine("Communication error");
}
finally
{

if (sr != null)
sr.Close();
if (sw != null)
sw.Close();
if (ns != null)
ns.Close();
if (IRCConnection != null)
IRCConnection.Close();

}

}

}

}


Voilà, je voulais savoir si quelque chose cloche dans ce code ? D'où cela peut-il provenir et comment y remédier ?

4 réponses

Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
20
Salut,

question :
qui appelle la méthode "Destroy" qui provoque l'arret du thread ?
et de quelle partie du code ?
J'imagine que c'est la classe allouant les "IRCBot"...

La fonction IRCThread.Abort() dans "Destroy" provoque 2 fois le ThreadAbordException (a la fin du catch de CallbackThread)
du coup il se peut que le finally ne soit jamais exécuté, a tracer.

As-tu vérifié que le nombre de thread "alive" n'était pas énormément supérieur au nombre d'utilisateurs effectivement connecté ?

bye...
Messages postés
6
Date d'inscription
samedi 27 mars 2010
Statut
Membre
Dernière intervention
17 février 2013

Bonjour et merci beaucoup d'avoir répondu,
je suis débutant en c# et je ne connais pas grand chose mise à part ce qu'il y a dans la page de code ci-dessus.

Au niveau du Thread, je ne suis pas encore très bien initié, donc pardonnez-moi si cela ne répond pas à votre question.

La méthode Destroy() est appelé dans une page de code qui s'execute à chaque connexion d'un client à l'emulateur.
       
        internal IRCBot userIRC;
        internal int IRC_MonitoriNumber;
        internal int IRC_PortNumber;
        internal  void InitIRC(string Username, string mission, string sexe, uint Id)
        {
            IRC_MonitoriNumber = ButterflyEnvironment.GetRandomNumber(1, 20);
            IRC_PortNumber = ButterflyEnvironment.GetRandomNumber(6661, 6664);

            IRCConfig conf = new IRCConfig();
            conf.userID = Id;
            conf.name = "" + sexe + " " + sexe + " " + sexe + " :" + Id + "";
            conf.nick = "[" + Username + "]";
            conf.port = IRC_PortNumber;
            conf.server = "46.105.100.41";
            conf.channel = IRC_MonitoriNumber;
            conf.isarealBot = false;

            
            userIRC = new IRCBot(conf);          
        }

        internal void destroyIRC()
        {
            userIRC.Destroy();
            userIRC = null;
            IRC_MonitoriNumber = 0;
        }


Par contre, non, je n'ai pas eu l'occasion de vérifier le nombre de Threads lorsque que le serveur m'a annoncé le message d'erreur "Out of memory".
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
20
Re,

Tu peux toujours essayer ces 2 modif. (si possible bien sur) afin d'éviter la double exception interne (ThreadAbordException) et de laisser le nettoyage de la mémoire au framework.

1 : Enlever la ligne suivante de la méthode destroy :
GC.SuppressFinalize(IRCThread);

2 : Ajouter un bloc catch afin de demander la suppression du renvoi d'exception.

public void CallbackThread()
{
    try
    {
        sendData("USER", config.name);
        sendData("NICK", config.nick);

        //Lets go funny raws
        IRCWork();
    }
    catch (ThreadAbortException)
    {	
        Thread.ResetAbort();
    }
    catch (Exception exc)
    {
        //Logging.WriteLine("Communication error : " + exc.MEssage);
    }
    finally
    {
        if (sr != null)
            sr.Close();
        if (sw != null)
            sw.Close();
        if (ns != null)
            ns.Close();
        if (IRCConnection != null)
            IRCConnection.Close();
    }
}


Bon courrage...
Messages postés
6
Date d'inscription
samedi 27 mars 2010
Statut
Membre
Dernière intervention
17 février 2013

Merci de ton aide, ça a l'air de fonctionner mais quelqu'un continue de me dire que "1000 Threads c'est beaucoup trop quand même et que ça va tout faire buguer"...