2017-01-12 1 views
1

Ich versuche, einen Integer-Wert in einen ElapsedEventHandler zu übergeben, damit ich Logik basierend auf dem übergebenen Integer machen kann. Wenn das Event ausgelöst wird, ist der Wert jedoch nicht der Wert I initialisiert es zu. Ich verstehe vielleicht nicht vollständig, wie der Delegierte arbeitet.Wie man ein Argument in ElapsedEventHandler übergibt

class Example 
{ 
    Dictionary<int, Timer> timer; 

    public Example() 
    { 
     timer = new Dictionary<int, timer>(); 
     for(int i = 0; i < 12; ++i) 
     { 
      timer.Add(i, new Timer(5000)); 
      timer[i].Elapsed += delegate { TimerTickCustom(i); }; 
     } 
    } 
    public void Process() // called each cycle 
    { 
     for(int i = 0; i < 12; ++i) 
     { 
      timer[i].Start(); 
     } 
    } 
    private void TimerTickCustom(int i) 
    { 
     // The value of i coming in does not match the dictionary key. 
    } 
} 
+1

Versuchen Sie, ein neues Objekt zu erstellen, das 'Timer' erweitert und dort ein Feld erstellt! – Ilan321

+0

Würde ich den Delegierten zu diesem Zeitpunkt noch verwenden? – user2970916

+0

@ Ilan321 Sie erstellen nicht jedes Mal einen neuen Timer, wenn Sie Daten im 'tick'-Handler verwenden möchten. Das macht keinen konzeptionellen Sinn (es ist keine andere Art von Timer), es ist viel mehr Arbeit, und es ist einfach unnötig. – Servy

Antwort

1

Es hängt davon ab, wo der lokale Wert i für die Delegierten ist es als „spezifisch“ zu betrachten, um es Anwendungsbereich ist. Da i außerhalb der Schleife definiert ist, definiert der Delegat nicht seine eigene "Kopie" dieser Variablen - da alle Delegierten dasselbe erwarten i.

Was Sie tun müssen, ist es eine Variable zuweisen, die "auf der gleichen Ebene" wie der Delegat selbst ist.

Nicht sicher, ob ich die richtige Sprache hier verwende, um es zu erklären. Aber dies sollte funktionieren:

class Example 
{ 
    Dictionary<int, Timer> timer; 

    public Example() 
    { 
     timer = new Dictionary<int, Timer>(); 
     for(int i = 0; i < 12; ++i) 
     { 
      int iInScopeOfDelegate = i; 
      timer.Add(i, new Timer(5000)); 
      timer[i].Elapsed += delegate { TimerTickCustom(iLocalToDelegate); }; 
     } 
    } 
    public void Process() // called each cycle 
    { 
     for(int i = 0; i < 12; ++i) 
     { 
      timer[i].Start(); 
     } 
    } 
    private void TimerTickCustom(int i) 
    { 
     // The value of i coming in does not match the dictionary key. 
    } 
} 

es einige interesting discussion ist, wenn Sie wissen, welche Wörter in die Suchmaschine eingeben (die natürlich können Sie nicht wirklich wissen, bis Ihnen jemand sagt).

Verwandte Themen