Ce qui suit est mon fichier de classe,
//online.cs (détection en ligne de l'utilisateur)
/ * Idées de mise en œuvre du programme:
L'utilisateur a les attributs suivants:
Nom: nom d'utilisateur
SessionID: ID utilisateur, le seul montre un utilisateur à travers lui
Est où: des informations supplémentaires, où l'utilisateur est actuellement situé
Dernier temps: heure de connexion de l'utilisateur
Curtime: rafraîchir l'heure cette fois
Sur le client, en utilisant un iframe, en chargeant une page de rafraîchissement et à la mise à jour du curtime correspondant à son nom toutes les xx secondes, cela signifie qu'il est toujours
Côté serveur, créez un thread Guardian, exécutez une fois à chaque fois, puis déterminez si l'intervalle de temps dans toute la liste des utilisateurs actuelle est dépassé
Si le temps spécifié est dépassé, l'utilisateur supprime de la liste en ligne, afin que vous puissiez détecter si l'utilisateur est en ligne et s'il est seul
Écrivez un traitement hors ligne de l'utilisateur pour résoudre de nombreuses personnes en demandant: le traitement de l'utilisateur après avoir accroché accidentellement la ligne.
* /
#Define_debug
Espace de noms Soholife
{{
Utilisation du système;
Utilisation de System.Data;
Utilisation de System.Data.SqlClient;
Utilisation de System.Collections;
Utilisation de System.threading;
Utilisation de System.Web;
Utilisation de System.diagnostics;
// définir une structure
Utilisateur de structure publique
{{
nom de chaîne publique;
Public DateTime Last fois;
public DateTime Curtime;
Public String SessionID;
La chaîne publique est partout;
}
// définir la classe d'utilisateurs en ligne
classe publique en ligne
{{
ArrayList statique privé;
ALLUSER PUBLIQUE ARRAY
{{
geturn_alluser;}
set {_AllUser = valeur;}
}
public onlineUser () // Construire une fonction
{{
if (_allurs == null)
{{
_AllUser = new ArrayList ();
}
}
// Fonction Description: Ajoutez l'utilisateur actuel à la liste en ligne
// Si les données de l'utilisateur sont toujours dans la liste en ligne, il n'est temporairement pas autorisé à se connecter à l'utilisateur, ce qui incite l'utilisateur à exister
BOOLADDUSERTONELINE publique (utilisateur utilisateur)
{{
// Vous devez déterminer si l'utilisateur est déjà dans la liste d'utilisateurs
if (_allurs == null)
{{
_ALLUser.add (utilisateur);
Return (true);
}
autre
{{
pour (int i = 0; i <_AlUser.Count; i ++)
{{
// le jugement du cycle si l'utilisateur existe déjà
SOHOHIFE.USER TESTER = (SOHOLIFE.USER) _ALLUSER [I];
If (tempuser.SessionId.equals (user.SessionId) && tempuser.name.equals (user.name)))
{{
Return (false); // l'utilisateur existe, puis sortez directement
}
}
_ALLUser.add (utilisateur);
Return (true);
}
}
// Fonction Description: Déterminez si un utilisateur est en ligne, cette partie n'est pas utilisée pour le moment
// Valeur de retour: True représente en ligne, False n'est pas là
Publicboolean Isauseronline (nom de la chaîne)
{{
// Vous devez déterminer si l'utilisateur est déjà dans la liste d'utilisateurs
if (_allurs == null)
{{
Return (false);
}
autre
{{
pour (int i = 0; i <_AlUser.Count; i ++)
{{
// le jugement du cycle si l'utilisateur existe déjà
SOHOHIFE.USER TESTER = (SOHOLIFE.USER) _ALLUSER [I];
if (tester.name.equals (nom))
{{
Return (true);
}
}
Return (false);
}
}
// Description de la fonction: Mettez à jour l'heure en ligne de l'utilisateur
// Valeur de retour: la dernière liste d'utilisateurs en ligne
Boolean CheckUseronline public (nom de la chaîne)
{{
// Vous devez déterminer si l'utilisateur est déjà dans la liste d'utilisateurs
if (_AllUser! = null)
{{
pour (int i = 0; i <_AlUser.Count; i ++)
{{
SoHoHife.UserTempUser = (SoHoHife.User) _ALLUSER [I];
// Déterminez d'abord si l'utilisateur actuel est vous-même
if (tester.name.equals (nom))
{{
// Mette à jour l'heure en ligne de l'utilisateur
tempuser.curtime = datetime.now;
alluser [i] = tempuser;
Return (true);
}
}
}
Return (false);
}
}
/ *
Commençons à établir une classe de fil Guardian:
(Remarque: ici, quand j'ai commencé à écrire
Après de nombreux problèmes, j'ai finalement décidé d'abandonner et d'utiliser le format existant, mais je viens de comprendre une seule pièce du bonheur.
L'utilisera pour écrire à nouveau un autre mode)
* /
CHICKONNELLE DE CLASSE PUBLIQUE
{{
Const dans Delay_times = 5000;
Const dans Delay_seconds = 30;
Thread privé;
Bool statique privé = false;
Public CheckOnline ()
{{
if (! _flag)
{{
_Flag = true;
this.thread = nouveau thread (nouveau threadStart (ThreadProc));
thread.name = utilisateur en ligne;
Thread.start ();
}
}
Internet void threadProc ()
{{
Tandis que (vrai)
{{
SOHHOLIFE.OnlineUseUsr Test = new SoHoLife.OnLineauSer ();
pour (int i = 0; i <temp.ALLUser.Count; i ++)
{{
utilisateur tmpuser = (utilisateur) temp.ALLUSER [i];
// J'ai ajouté le dernier temps de l'utilisateur à 80 secondes, puis comparé à l'heure actuelle, à l'heure petite et actuelle,
// Cela signifie que l'utilisateur a suspendu la ligne, puis son dossier est supprimé
if (tmpuser.curtime.adddseconds (delay_seconds) .compareto (datetime.now) <0)
{{
temp.ALLUSER.REMOVEAT (I);
}
}
Thread.sleep (delay_times);
}
}
}
}
L'instruction de compilation est: CSC / T: Library /out:../bin/online.dll / r: System.dll Online.cs