C# system.timers.timer 奇怪的行为
Posted
技术标签:
【中文标题】C# system.timers.timer 奇怪的行为【英文标题】:C# system.timers.timer weird behavior 【发布时间】:2018-01-03 22:12:03 【问题描述】:我正在尝试实现 Bully Coordinator 选举算法。在该算法中,Coordinator 每隔 10 秒发送一次存活消息,所有进程至少等待 14 秒才能接收到存活消息,如果在这段时间内没有收到消息,它们将发起死协调者选举。
问题是 AliveTimer (Timer3_Count) 呈指数增长,并且活动进程也在影响它。我不知道为什么它的行为很奇怪。
当初始协调器发送 Alive 消息时,计数器工作正常,但在死亡协调器选举后,它的行为很奇怪。
else if (Received_Text.Contains("Alive:"))
SetText(Received_Text + "\n");
Coordinator_Alive = true;
Timer3_Counter = 0;
if (Alive_Count == 0)
Alive_Count++;
AliveTimer.Interval = (1 * 1000);
AliveTimer.Enabled = true;
AliveTimer.Elapsed += new System.Timers.ElapsedEventHandler(AliveTimer_Elapsed);
AliveTimer.Start();
经过的函数在这里 我认为我的程序有问题,我尝试了所有方法。
private void AliveTimer_Elapsed(object sender, EventArgs e)
Timer3_Counter++;
SetTimer(Timer3_Counter.ToString());
Random rnd = new Random();
int rand_time = rnd.Next(14, 18);
if (Timer3_Counter == 14)
AliveTimer.Stop();
Timer3_Counter = 0;
Alive_Count = 0;
if (Coordinator_Alive == false)
byte[] buffer = Encoding.ASCII.GetBytes("Dead Coordinator Election: " + txName.Text);
_clientSocket.Send(buffer);
Timer4_Counter = 0;
DeadTimer.Interval = (1 * 1000);
DeadTimer.Elapsed += new System.Timers.ElapsedEventHandler(DeadTimer_Elapsed);
DeadTimer.Enabled = true;
DeadTimer.Start();
if (Coordinator_Alive == true)
Coordinator_Alive = false;
死的协调器选举代码在这里
else if (Received_Text.Contains("Dead Coordinator Election:"))
SetCPID("");
Coordinator_Alive = false;
Alive_Count = 0;
Timer3_Counter = 0;
AliveTimer.Stop();
AliveTimer.Enabled = false;
string output = Regex.Match(Received_Text, @"\d+").Value;
SetText("Dead Coordinator Election Received from Process ID: " + output + "\n");
if (Convert.ToInt32(txName.Text) > Convert.ToInt32(output))
byte[] buffer = Encoding.ASCII.GetBytes("Greater Process No: " + txName.Text + " found than " + output + "\n");
_clientSocket.Send(buffer);
SetText("Our Process No: " + txName.Text + " is Greater than " + output + "\n");
Lower_Count++;
byte[] buffer1 = Encoding.ASCII.GetBytes("Dead Coordinator Election: " + txName.Text);
_clientSocket.Send(buffer1);
else
byte[] Txt_Send = Encoding.ASCII.GetBytes("Our Process No: " + txName.Text + " is less than " + output);
_clientSocket.Send(Txt_Send);
Greater_Count++;
完整的代码可以在这里找到 Bully Algorithm
注意:我使用被动服务器只是为了广播来自每个进程的消息
【问题讨论】:
问题是 AliveTimer (Timer3_Count) 呈指数增长,并且活动进程也在影响它。我不知道为什么它的行为很奇怪。 您几乎可以肯定会多次连接Elapsed()
处理程序。这将导致您的代码为每个“滴答”运行多次。您应该只连接该处理程序一次,通常是在您创建它时。
当我停止并再次启动计时器时,它开始多次滴答作响。如何避免这种情况?
...你是如何停止和启动计时器的?请向我们展示该代码。
【参考方案1】:
我不知道问题的原因,但我认为你如果你记录启动和停止所有方法并分析,将能够快速找出原因输出。
这将有助于确定: 1. 正如@Idle_Mind 建议的那样,您正在添加越来越多的处理程序 2. 执行每个方法所花费的时间逐渐增加 还有更多...
我不知道您的应用是如何构建的,但您甚至可以从 Console.WriteLine
或 Debug.WriteLine
开始。
【讨论】:
以上是关于C# system.timers.timer 奇怪的行为的主要内容,如果未能解决你的问题,请参考以下文章
C# System.Timers.Timer 类已用事件和定时器的一般注意事项
通过C#的System.Timers.Timer封装一个定时任务工具
使用System.Timers.Timer类实现程序定时执行