J'écris un programme qui envoie et reçoit des messages à une autre application. Certains messages doivent être envoyés à certains intervalles. Par exemple, j'ai quatre messages qui sont envoyés, un devrait être envoyé toutes les 8 secondes, deux doivent être envoyés toutes les 0,5 secondes et un devrait être envoyé toutes les secondes.Événements ne se produisant pas à l'intervalle de temps correct C# timers
Les messages semblent bien envoyer, mais ils sont tous envoyés en même temps. J'ai utilisé un horodatage pour déterminer qu'ils semblent tous être envoyés toutes les 11 secondes. Voici le code que j'ai implimented:
Voici où les minuteries sont déclarés:
System.Timers.Timer statusTimer = new System.Timers.Timer(1000);
System.Timers.Timer heightTimer = new System.Timers.Timer(500);
System.Timers.Timer keepAliveTimer = new System.Timers.Timer(8000);
System.Timers.Timer longHeightTimer = new System.Timers.Timer(500);
Et ici dans la fenêtre principale, ils sont mis en marche (ce qui est un projet WPF):
statusTimer.Start();
heightTimer.Start();
keepAliveTimer.Start();
longHeightTimer.Start();
statusTimer.Elapsed += delegate { sendStatusMessage(); };
heightTimer.Elapsed += delegate { sendHeightMessage(); };
keepAliveTimer.Elapsed += delegate { sendKeepAliveMessage(); };
longHeightTimer.Elapsed += delegate { sendLongWarpMessage(); };
Voici un exemple d'une méthode qui devrait être déclenchée quand le temps est écoulé (il n'y a pas grand intérêt à les montrer tous car ils sont tous fondamentalement les mêmes):
public void sendStatusMessage()
{
sendMessage(status_msg.TranslateToMessage());
Dispatcher.Invoke(DispatcherPriority.Normal, (System.Action)delegate //change the priority so you can use UI
{
statusMsgLbl.Content = "Status Msg Sent: " + DateTime.Now.ToLongTimeString();
});
}
Et enfin ce la méthode qui envoie le message, sous forme d'octets, à l'autre application à l'aide d'un flux réseau:
public void sendMessage(byte[] toSend)
{
try
{
lock (NSLock)
{
for (int i = 0; i < toSend.Length; i++)
{
nwStream.WriteByte(toSend[i]);
nwStream.Flush();
}
}
}
catch { MessageBox.Show("Unable to send message"); }
}
En note, il semble extrêmement inefficace d'écrire et de vider chaque octet dans un flux, quand vous pouvez écrire tout le tableau d'octets avec un seul ['Write (toSend, 0, toSend.Length)'] (https: // msdn.microsoft.com/en-us/library/system.io.stream.write(v=vs.110).aspx) appel. Il peut également être judicieux d'utiliser la classe DispatcherTimer pour éviter d'appeler Dispatcher.Invoke. – Clemens
@Clemens merci pour les conseils! –