有人可以请澄清System.Threading.Timer的正确用法。使用.Change重置System.Threading.Timer
我有一个服务器客户端确认响应模型。如果在设定的时间段内没有收到确认,我想要做的就是从服务器重新发送记录的消息。
所以当发送第一条消息时,我存储一个Timer;
AutoResetEvent autoEvent = new AutoResetEvent(false);
TestsTimeout timeout = new TestsTimeout(firstTest, _socket);
TimerCallback resendCallback = timeout.ResendMessage;
Timer timeoutTimer = new Timer(resendCallback, autoEvent, timeoutPeriod, timeoutPeriod);
然后,当接收到消息的确认时,我只想重置时间并发送下一个消息。
timeout.Change(0, timeoutPeriod);
现在,我跟着MSDN这个例子,但是,0似乎马上调用回调?它是否正确?这样做的核心方法是什么?
这样的代码只会增加问题,它不能解决任何问题。您已经从autoEvent的等待调用中获得了完美的超时。少一个线程比赛错误,你必须修复。 –
对不起,你能扩展你的意思吗?基本上,我从服务器发送一个消息到Web客户端,然后客户端会通过消息回复消息。如果服务器没有收到此消息,我想重新发送最后一条消息作为失败保护。 autoEvent如何帮助这个呢? –
使用AutoResetEvent的一点是,您在代码中的其他地方等待它发出信号。通常使用WaitOne()调用,您可以在该调用中指定超时。次要问题正是你想要解决的问题。如果客户端没有响应,则它挂起或重新发送消息不会解决问题。或者它负载过重,只是没有完成这项工作,在这种情况下,通过给予更多的工作来解决问题。如果您需要比TCP更可靠的方法,那么您应该使用MessageQueue。 –