2016-04-17 15 views
0

Ich verwende diesen Code, um meine installierten Programme (appwiz.cpl) und meine ipconfig alle 5 Sekunden zu überprüfen.System.Threading.Timer funktioniert nicht konstant

Ich benutze einen Thread, da ich eine GUI habe und es aktiv bleiben muss.

public void time() { 
var time = new System.Threading.Timer(x => 
{ 
    conf(); 
    ncpa("ipconfig /all"); 
}, null, 5000, Timeout.Infinite); 
} 

Ich habe meine Rückruf am Ende des „ncpa“ Methode, wie time();

Es funktioniert, aber nach ein paar Minuten die Fäden werden mit dem Code 259, verlassen und wird nicht mehr ausgeführt werden.

Danke für die Hilfe!

+0

Was meinst du mit Rückruf? –

+0

Ich rufe 'time()' erneut auf, am Ende der Methode 'ncpa()' – Maske13

+0

Ein Timer stellt bereits eine wiederkehrende Aufgabe dar, wenn Sie also 'time()' erneut aufrufen, wird ein weiterer Timer gestartet . Also wird alle 5 Sekunden ein zusätzlicher Timer gestartet, während die anderen weiterlaufen (ich sehe nicht, dass du sie irgendwo endest). Versuchen Sie, diesen "Rückruf" zu entfernen, der möglicherweise funktioniert. – bassfader

Antwort

1

Zuerst haben Sie "Infinite" für den periodischen Aufruf verwendet, was bedeutet, dass es nicht periodisch signalisieren wird. Darüber hinaus, wenn Zeit in einer Variablen wie diesem verwendet wird, kann es sein, dass es von GC gesammelt wird, nachdem Sie den Bereich der "Zeit" -Variable verlassen haben. Versuchen Sie es zu ändern und machen Sie die Variable "time" zu einem Feld in Ihrer Klasse.

Wenn es ein Instanzfeld ist, dann würde es in Betracht ziehen, keine Referenzen zu haben, wenn das Objekt selbst keine Referenzen hat. Wenn Sie es zu einem statischen Feld machen, wird es als Root betrachtet, und die Referenz wird beibehalten, solange Sie sie nicht manuell ändern.

Zum Beispiel:

class Program 
{ 
    private static System.Threading.Timer _timer = new Timer(_ => Console.WriteLine("Hi"), 
     null, 1000, 1000); 
    static void Main(string[] args) 
    { 
     Console.ReadLine(); 
    } 
} 

Hoffnung, das hilft.

+0

Könnten Sie mir zeigen, wie? – Maske13

+0

@Tom in Ihrer Klasse setzen Sie einfach "private System.Threading.Timer _timer = new ...." –

+0

Aus irgendeinem Grund kann ich es nicht zur Arbeit, eine Chance, Sie könnten Ihre Antwort mit dem Code bearbeiten? Ich denke, ich habe etwas falsch gemacht .. – Maske13