我正在编写一个程序,它将消息发送并接收到另一个应用程序。 一些消息必须以特定的时间间隔发送。例如,我有四条发送的消息,每8秒发送一条消息,每0.5秒发送两条消息,每隔1秒发送一条消息。以正确的时间间隔不发生事件c#定时器
消息似乎发送正常,但他们都在同一时间发送。我使用时间戳来确定它们似乎每隔11秒就会发送一次。下面是我implimented代码:凡声明定时器的
这里是:
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);
在这里,在他们开始(这是一个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(); };
下面是一个方法的例子,它应该在时间流逝时被触发(因为它们基本都是相同的,所以没有太多的要点):
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();
});
}
最后此使用网络流发送该消息时,以字节为单位,对其他应用程序的方法,包括:
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"); }
}
注意,当你可以用一个单独的['Write(toSend,0,toSend.Length)'](https://)写入整个字节数组并将每个单字节写入一个流时, msdn.microsoft.com/en-us/library/system.io.stream.write(v=vs.110).aspx)调用。使用DispatcherTimer类来避免调用Dispatcher.Invoke也是有意义的。 – Clemens
@Clemens谢谢你的提示! –