Il secondo metodo da implementare è SendMessage che deve semplicemente inviare a tutti i client connessi i messaggi in arrivo.
public void SendMessage(string nick, string message) {
ChatEventArgs e = new ChatEventArgs();
e.message = message;
e.name = name;
e.msgType = MessageType.SendMessage;
BroadcastMessage(e);
}Questo metodo è abbastanza banale in quanto deve solo impacchettare i dati del messaggio nella solita istanza della classe ChatEventArgs e passarla al metodo BroadcastMessage.
Il terzo ed ultimo metodo è SignOut che notifica i vari client della disconnessione di un utente.
public void SignOut(string nick) {
lock (synchronize) {
chatters.Remove(nick);
}
ChatEvent -= myEventHandler;
ChatEventArgs e = new ChatEventArgs();
e.msgType = MessageType.SignOut;
e.name = name;
BroadcastMessage(e);
}Anche in questo caso, il metodo è alquanto banale in quanto deve accedere alla lista degli utenti in maniera Thread-Safe (cioè preoccupandosi di acquisire il lock sulla risorsa) ed eliminare l'utente dalla lista. Successivamente il passo sarà semplicemente quello di impacchettare i dati e spedirli con la solita procedura vista negli snippet precedenti.
Per completezza è bene fare una veloce analisi dei metodi che gestiscono fisicamente il callback verso i vari client BroadcastMessage e ChatEventHandler.
private void BroadcastMessage(ChatEventArgs e) {
ChatEventHandler tmp = ChatEvent;
if (tmp != null) {
foreach (ChatEventHandler handler in tmp.GetInvocationList()) {
handler.BeginInvoke(this, e, new AsyncCallback(EndAsync), null);
}
}
}
private void ChatEventHandler(object sender, ChatEventArgs e) {
try {
switch (e.msgType) {
case MessageType.SendMessage:
callback.ReceiveMessage(e.message);
break;
case MessageType.SignIn:
callback.SignIn(e.name);
break;
case MessageType.SignOut:
callback.SignOut(e.name);
break;
}
}
catch {
Leave(e.name);
}
}BroadcastMessage sfrutta il metodo GetInvocationList, ereditato dalla classe MulticastDelegate, per ottenere tutti i delegati sottoscritti ad un determinato evento. Successivamente, in maniera asincrona, questi delegati vengono invocati uno ad uno.
Il metodo ChatEventHandler corrisponde al delegato invocato dal metodo BroadcastMessage e semplicemente invia il messaggio sfruttando il canale di callback che è stato aperto quando ogni utente ha eseguito il SignIn.
Attenzione: Questo articolo contiene un allegato
Contenuti dell'articolo
- Pagina 1
- Pagina 2
- Pagina 5
- Pagina 6
Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.







Difficoltà
Utilità
Stampa
Download


10annidi.ASPItalia.com: iscriviti alla competizione e vinci fantastici premi ogni mese!

ciao Stefano, bell'articolo, molto interessante l'invocazione asincrona dei delegati sottoscritti all'evento.- C'é un motivo per cui non hai usato la ...
Continua »»» | Rispondi »»»