Bonjour,

je suis en train de développer une application (un service windows) qui communique en TCP/IP avec d'autres applications.

Nom : Schema.png
Affichages : 203
Taille : 1,7 Ko

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 : Sélectionner tout - Visualiser dans une fenêtre à part
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