1 pièce(s) jointe(s)
Envoi/Reception de messages TCP/IP entre plusieurs applications, synchronisation des threads
Bonjour,
je suis en train de développer une application (un service windows) qui communique en TCP/IP avec d'autres applications.
Pièce jointe 181035
1. "Application1" demande une valeur à "Mon application" via TCP/IP.
2. "Mon application" doit demander cette valeur à l'application2 (toujours via TCP/IP)
3. "Application2" retourne la valeur demandée.
4. "Mon application" retourne la valeur obtenue à "Application1".
J'ai eu idée de synchroniser les threads d'envoi et de réception avec ManualResetEvent.
Sur réception du message de "Application1" par "Mon application", la méthode GetInfoValue est appelée.
Cette méthode envoie un message à "Application2" pour demander la valeur requise.
Le thread est bloqué avec l'appel à manualEvent.WaitOne
Sur réception de la réponse de "Application2", la valeur à retourner est initialisée(m_RequestedValue) et le thread est débloqué (manualEvent.Set)
Suite au déblocage du thread, un nouveau message est envoyée à "Application1" avec la valeur obtenue.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
private InfoValue m_RequestedValue;
// Synchronisation
private System.Threading.ManualResetEvent manualEvent;
public InfoValue GetInfoValue(string infoKey)
{
this.SendMessage(new RequestToLC { InfoKey = infoKey });
manualEvent.Reset();
if (manualEvent.WaitOne(3000))
return m_RequestedValue;
else
return null;
}
/// <summary>
/// Réception d'un nouveau message
/// </summary>
/// <param name="sender">Emetteur de l'évènement</param>
/// <param name="e">Evenement associé incluant le message TCP réceptionné</param>
private void ReceivedMessage(object sender, ReceivedMessageEventArgs e)
{
var requestedValue = e.RequestedValue;
// Traitement du message reçu
if (requestedValue != null)
{
m_RequestedValue = requestedValue;
manualEvent.Set();
}
} |
Selon vous, ai-je bien fait de synchroniser les threads d'envoi et de réception avec ManualResetEvent.
Sinon, comment aurais-je dû procéder selon vous ?
Merci d'avance,
Etienne