2017-07-28 3 views
0

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

+2

_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. –

+0

es begann mehrmals zu ticken, als ich anhielt und den Timer erneut startete. Wie vermeide ich das? – Mayur

+0

... und wie stoppen und starten Sie den Timer? Zeig uns bitte den Code. –

Antwort

0

Ich weiß nicht, was das Problem verursacht, aber ich denke Sie kann die Ursache schnell herausfinden, wenn Sie log starten und stoppen Sie alle Methoden und analysieren Sie die Ausgabe.

Dies würde helfen, festzustellen, ob: 1. Wie @Idle_Mind vorgeschlagen, dass Sie hinzufügen, mehr und mehr Handler 2. Die Zeit, jede Methode kriecht auszuführen und mehr ...

I don Ich weiß nicht, wie deine App aufgebaut ist, aber du kannst sogar mit oder Debug.WriteLine anfangen.