C# 使用.Change重置System.Threading.Timer
请有人澄清System.Threading.Timer的正确用法 我有一个服务器客户端确认响应模型。我的目标是,如果在设定的时间段后没有收到确认,则从服务器重新发送记录的消息 因此,当发送第一条消息时,我存储了一个计时器C# 使用.Change重置System.Threading.Timer,c#,multithreading,timer,C#,Multithreading,Timer,请有人澄清System.Threading.Timer的正确用法 我有一个服务器客户端确认响应模型。我的目标是,如果在设定的时间段后没有收到确认,则从服务器重新发送记录的消息 因此,当发送第一条消息时,我存储了一个计时器 AutoResetEvent autoEvent = new AutoResetEvent(false); TestsTimeout timeout = new TestsTimeout(firstTest, _socket); TimerCallback resendCal
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的等待调用中获得了非常好的超时。少了一个线程竞赛错误,你必须修复。对不起,你能详细说明一下你的意思吗?基本上,我从服务器通过web套接字发送一条消息,客户机将通过消息进行确认。如果服务器没有收到此消息,我想作为故障保护重新发送最后一条消息。autoEvent如何对此提供帮助呢?使用AutoResetEvent的意义在于,在代码中的其他地方,等待它发出信号。通常,对于WaitOne()调用,可以在该调用中指定超时。第二个问题就是你想解决什么问题。如果客户端没有响应,那么它要么挂起,重新发送消息也解决不了这个问题。或者它负载很重,只是没有时间去做这项工作,在这种情况下,你通过给它更多的工作来让问题变得更糟。如果您需要比TCP更可靠的方法,那么您应该使用MessageQueue。谢谢。我正在尝试覆盖web套接字连接中丢失消息的可能性。我的想法是,我设置了一个超时,如果确认没有在设定的时间内发送,我会尝试发送上一条消息。我必须使用we套接字,所以tcp在这里不是一个真正的选项。我希望超时触发的可能性应该很小,因为我觉得这有点含糊不清?对我来说,这意味着设置为零将重新启动它。它似乎触发了它?在我的例子中,它需要是timeout.infinite吗?是的,使用timeout.infinite。零不是特例。当传递x时,表示在x毫秒后调用回调。这里是0毫秒。