Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用.Change重置System.Threading.Timer_C#_Multithreading_Timer - Fatal编程技术网

C# 使用.Change重置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

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