2015-09-27 36 views
1

有人可以请澄清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似乎马上调用回调?它是否正确?这样做的核心方法是什么?

+0

这样的代码只会增加问题,它不能解决任何问题。您已经从autoEvent的等待调用中获得了完美的超时。少一个线程比赛错误,你必须修复。 –

+0

对不起,你能扩展你的意思吗?基本上,我从服务器发送一个消息到Web客户端,然后客户端会通过消息回复消息。如果服务器没有收到此消息,我想重新发送最后一条消息作为失败保护。 autoEvent如何帮助这个呢? –

+0

使用AutoResetEvent的一点是,您在代码中的其他地方等待它发出信号。通常使用WaitOne()调用,您可以在该调用中指定超时。次要问题正是你想要解决的问题。如果客户端没有响应,则它挂起或重新发送消息不会解决问题。或者它负载过重,只是没有完成这项工作,在这种情况下,通过给予更多的工作来解决问题。如果您需要比TCP更可靠的方法,那么您应该使用MessageQueue。 –

回答

1

https://msdn.microsoft.com/en-us/library/yz1c7148(v=vs.110).aspx

指定零(0)立即重新启动定时器。

你走了。

+0

是的,我觉得这有点模棱两可?这意味着设置为零将重新启动它。它似乎触发它?在我的情况下是否需要timeout.infinite? –

+0

是的,使用Timeout.Infinite。零不是特例。当你传递x时,它意味着在x毫秒后调用回调函数。这里是0毫秒。 – usr