Ich versuche Bully Coordinator Wahlalgorithmus zu implementieren. In diesem Algorithmus sendet der Koordinator alle 10 Sekunden die Alive-Nachricht und alle Prozesse warten mindestens 14 Sekunden, bis sie lebend empfangen werden. Wenn sie die Nachricht nicht innerhalb dieser Zeit erhalten, werden sie eine totale Koordinatorwahl einleiten.C# system.timers.timer seltsames Verhalten
Das Problem ist, dass AliveTimer (Timer3_Count) exponentiell anwächst und auch aktive Prozesse davon betroffen sind. Ich weiß nicht, warum es sich seltsam benimmt.
Wenn der initiale Koordinator die Alive-Nachricht sendet, funktioniert der Zähler einwandfrei, aber nach der Wahl des toten Koordinators verhält er sich merkwürdig.
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();
}
}
Die verstrichene Funktion hier ist Ich denke, es ist etwas falsch mit meinem Programm ist, habe ich alles versucht.
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;
}
und die Toten Wahl Code Koordinator ist hier
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++;
}
}
Der vollständige Code finden Sie hier Bully Algorithm
Anmerkung: Ich passiven Server verwende nur Nachrichten von jedem Prozess zu übertragen
_Das Problem ist, dass AliveTimer (Timer3_Count) exponentiell ansteigt und auch aktive Prozesse dies beeinflussen. Ich weiß nicht, warum es sich merkwürdig verhält. Sie werden den Handler 'Elapsed()' wahrscheinlich mehrmals miteinander verkabeln. Dies führt dazu, dass Ihr Code mehrmals für jeden "Tick" ausgeführt wird. Sie sollten diesen Handler nur einmal ** verbinden, normalerweise wenn Sie ihn erstellen. –
es begann mehrmals zu ticken, als ich anhielt und den Timer erneut startete. Wie vermeide ich das? – Mayur
... und wie stoppen und starten Sie den Timer? Zeig uns bitte den Code. –