8 Stimmen

System.Threading.Timer

Wenn wir System.Threading.Timer verwenden, wird dann die Methode auf dem Thread ausgeführt, der den Timer erstellt hat? Oder wird es in einem anderen Thread ausgeführt?

class Timer
{
    static void Main()
    {
        TimerCallback tcall = statusChecker.CheckStatus;
        Timer stateTimer = new Timer(tcb, autoEvent, 1000, 250);
    }
}
class StatusChecker
{
    public void CheckStatus(Object stateInfo)
    {
    }
}

Meine Frage ist, ob die vom Timer-Delegaten aufgerufene Methode (CheckStatus) im Hauptthread ausgeführt wird oder ob sie in einem anderen Thread ausgeführt wird?

0 Stimmen

Es ist ziemlich unklar, was Sie hier versuchen zu fragen - könnten Sie bitte etwas Code posten, um Ihre Frage zu klären?

6voto

Øyvind Bråthen Punkte 56704

System.Threading.Timer führt seine Arbeit auf einem anderen Thread im Thread-Pool aus.

System.Windows.Forms.Timer wird auf dem bestehenden (GUI) Thread ausgeführt.

1 Stimmen

Auch zu beachten ist, dass der System.Windows.Forms.Timer wieder zu einem Threadpool-Thread zurückkehrt, wenn keine aktiven Formulare vorhanden sind (wie bei einer Konsolenanwendung). Und die Methode wird ausgeführt, wenn der Thread anderweitig untätig wäre (keine Ereignis-Handler ausgeführt werden). Aber du verbringst sowieso nicht viel Zeit in Ereignis-Handlern, oder? :)

0 Stimmen

@Vilx - Ich wusste das nicht, also danke für den zusätzlichen Kommentar zu meiner Antwort :)

0 Stimmen

Eigentlich... nehme ich das zurück. Es kehrt nicht zurück. Es ist nur in Windows Forms verwendbar. Aber ich bin mir sicher, dass ich vor nicht allzu langer Zeit einen der Standard-Timer gesehen habe, der zwischen Windows Forms oder Threadpool-Thread auswählte... finde ihn jetzt aber nicht mehr. :(

2voto

spender Punkte 111351

Die Dokumente sagen folgendes:

Die für den Rückruf spezifizierte Methode sollte reentrant sein, da sie auf ThreadPool-Threads aufgerufen wird.

Also wird der Rückruf höchstwahrscheinlich auf einem anderen Thread sein.

Natürlich besteht, wenn Sie den Timer von einem ThreadPool-Thread aus starten, die Möglichkeit, dass er auf demselben Thread ausgeführt wird, aber keine Garantie.

2voto

Danish Khan Punkte 1883

MSDN gibt an:

Verwenden Sie einen TimerCallback-Delegaten, um die Methode anzugeben, die der Timer ausführen soll. Der Timer-Delegat wird festgelegt, wenn der Timer erstellt wird, und kann nicht geändert werden. Die Methode wird nicht auf dem Thread ausgeführt, der den Timer erstellt hat; sie wird auf einem vom System bereitgestellten ThreadPool-Thread ausgeführt.

Daher würde in Ihrem Beispiel der Timer-Delegat (CheckStatus) in einem separaten Thread ausgeführt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X