2016-02-24 1 views
-1

Avant tout. Je ne suis pas très bon et j'espère que vous le comprendrez de toute façon. Im faisant une fonction dans mon programme où il vérifie si une ligne dans un RTB est en surbrillance. Sinon, il le met en évidence. Pour que cela fonctionne, j'ai dû utiliser différents threads pour pouvoir accéder à la RTB depuis différents endroits. Mon problème est qu'il crée un nouveau "délégué"/instance/thread chaque fois que la minuterie se rafraîchit. Je voudrais supprimer l'ancien thread/délégué ou le remplacer par le nouveau. Parce que maintenant le programme se bloque après un moment. C'est un très petit programme, mais après 40 secondes j'atteins plus de 3 Go d'utilisation de RAM.Supprimer ou remplacer Invoke Delegate C#

Merci d'avance! Haris.

code:

private void Timer()//Timer for color refresh 
{ 
    aTimer = new System.Timers.Timer(300); 
    aTimer.Elapsed += new ElapsedEventHandler(Form1_Load); 
    aTimer.AutoReset = true; 
    aTimer.Enabled = true; 
} 

private void RefreshColor()//Refreshing the color of selected row 
{ 
    this.Invoke((MethodInvoker)delegate 
    { 
     if (richTextBox1.SelectionBackColor != Color.PaleTurquoise) 
     { 
      HighlightCurrentLine(); 
     } 
    }); 

} 

private void Form1_Load(object sender, EventArgs e) 
{ 
    Timer(); 

    RefreshColor(); 
+0

Votre temporisateur déclenche l'événement Form1_Load qui déclenche à son tour une autre temporisation, etc. Vous n'avez besoin que d'une minuterie et vous pouvez vous débarrasser du délégué Invoke. Juste le minuteur démarre et toutes les 300ms et vérifie la couleur des rangées. –

Répondre

0

Qu'est-ce qui se passe si je ne me trompe pas est que vous créez et le démarrage de nouvelles minuteries de façon exponentielle. Donc vos formulaires se chargent, la méthode Form1_Load est appelée. Form1_Load crée un nouveau temporisateur qui, une fois écoulé, appellera à nouveau Form1_Load. Comme l'ancienne minuterie n'est pas disposée, deux minuteurs sont en cours d'exécution, ce qui créera deux nouveaux minuteurs. 4 timers créer 4 nouveaux donc il y a 8, 16, 32 et ainsi de suite ...

Fondamentalement, ce que vous avez à faire est d'appeler une autre méthode sur la minuterie écoulée:

private void Timer()//Timer for color refresh 
{ 
    aTimer = new System.Timers.Timer(300); 
    aTimer.Elapsed += ATimer_Elapsed;//new ElapsedEventHandler(Form1_Load); 
    aTimer.AutoReset = true; 
    aTimer.Enabled = true; 
} 

private void ATimer_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    RefreshColor(); 
} 

private void RefreshColor()//Refreshing the color of selected row 
{ 
    this.Invoke((MethodInvoker)delegate 
    { 
     if (richTextBox1.SelectionBackColor != Color.PaleTurquoise) 
     { 
      HighlightCurrentLine(); 
     } 
    }); 


} 

private void Form1_Load(object sender, EventArgs e) 
{ 
    Timer(); 

    RefreshColor(); 

minuterie(); est seulement appelé ceux créant ainsi une seule minuterie.

+0

Merci monsieur! Cela fonctionne parfaitement! –