Thread vs-Timer in C#
Habe ich zwei Implementierungen zu überprüfen, für die kommenden Daten:
Mit System.Timers.Timer
:
public void startTimer()
{
try
{
System.Timers.Timer timer = new System.Timers.Timer(1);
timer.AutoReset = true;
timer.Elapsed += new ElapsedEventHandler(commStart);
timer.Enabled = true;
timer.Start();
}
catch(Exception ex){}
}
private void commStart(){object sender, EventArgs eArgs}
Mit Thread
:
public void startThread()
{
Thread threadGeneralComm = new Thread(new ThreadStart(commStart));
threadGeneralComm.Start()
}
private void commStart()
{
while(true)
{
//checking data
Thread.Sleep(1);
}
}
Damit Sie sehen können, sowohl von der Umsetzung Möglichkeiten, es zu überprüfen, Daten und warten Sie, bis 1 Millisekunde. Die Leute beschweren sich zu mir, mit Timer schlechter ist als mit Thread, und einen Thread ist 10 mal schneller. Ist das der Fall?
was meinst du?
Die Daten kommen von wo? Wie die anderen Poster gesagt haben, polling sollte nicht notwendig sein, einen präemptiven mutitasker - es werden unnötigerweise CPU-Ressourcen und die Latenz erhöht.
Die Daten kommen von wo? Wie die anderen Poster gesagt haben, polling sollte nicht notwendig sein, einen präemptiven mutitasker - es werden unnötigerweise CPU-Ressourcen und die Latenz erhöht.
InformationsquelleAutor olidev | 2011-06-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beide Optionen sind schlecht. Sie sind polling-Methoden und-so verwenden CPU ohne Grund, wenn keine Daten vorhanden sind.
Wenn Sie nicht verwenden können, ein event-driven Ansatz, dann sollten Sie sich für eine Lösung basierend auf einer Warteschlange blockiert.
Polling ist schlecht, weil, wenn keine Daten verarbeitet werden, dein thread wird immer wieder wach und verbrauchen CPU, wenn es nichts zu tun.#
Ist es nicht oft der Fall ist aber jedoch, dass polling verwendet wird, weiter flussaufwärts?
Ich sehe keinen Grund, warum ein timer-Implementierung erfordert polling.
Ich war nicht zu sagen sonst. nur den Punkt machen, dass, nur weil ein Entwickler OnSomeEvent() bedeutet nicht, dass Ereignisse verwendet werden unter der Haube.
InformationsquelleAutor David Heffernan
Windows-Anwendungen basieren auf event-driven architecture. Maus bewegen, Taste drücken, zeigt UI, Fenster verschieben, Größe ändern etc alle von Ihnen sind Ereignisse. Wenn es ein Ereignis gibt, für Ihre Anwendung, die windows zuweisen, die Veranstaltung zu so genannten Application-Queue und die window-Anwendung haben continous loops für die Veranstaltung von der Anwendung Warteschlange und verarbeiten die Veranstaltung durch die Dispatcher.
In dieser Weise, ein TIMER ist eine Veranstaltung, bei der registriert wird, wird das OS legen Sie die timer-Nachricht an die Warteschlange gestellt, so dass die Anwendung verarbeiten kann den timer. Der TIMER funktioniert immer auf dem UI-thread. So ist es bis auf das Betriebssystem, ob Sie das TIMER-Ereignis auf die app-queue oder nicht. Wenn das OS ist zu sehr damit beschäftigt, verpassen Sie möglicherweise Ihre timer-Ereignisse.
Einen thread hat einen eigenen Ausführungskontext, der garantiert ausgeführt werden.
Threads können garantiert ausgeführt werden, wenn in der richtigen Priorität, relativ zu der Haupt-thread. Dieses Konzept kann angewendet werden, um Timer zu.
InformationsquelleAutor
Der Unterschied zwischen den Lösungen
Der wesentliche Unterschied zwischen den Lösungen ist, dass die timer wird aufgerufen, jede Millisekunde, während die single thread Lösung wartet eine Millisekunde alle Daten überprüfen.
In der timer-Lösung, die Daten-Prüfung wird parallel stattfinden - jeden Rückruf erfolgt in einem anderen thread auf den thread-pool.
Zum Beispiel, wenn mit einem timer jede mit 10ms Intervall und die callback-Methode dauert 20ms zu verarbeiten, es werden mehrere aktive Rückrufe auf mehrere threads aus die Fäden pool.
Einzelner thread besser (in diesem Fall)
Unter der Annahme, dass in deinem Beispiel der Verarbeitung mehr als 1ms, es erklärt, warum es ist viel langsamer als mit einer single-thread.
Ich gehe davon aus, dass es möglicherweise eine bessere Lösung als diese - mit einem DB-trigger, der ein Ereignis oder callback... Aber wenn der einzige Weg, um an Informationen zu gelangen, indem Sie aktiv die überprüfung der Daten dann mit Hilfe der single-thread-Lösung ist besser.
InformationsquelleAutor Elisha
Wenn Sie darauf warten, für die Daten zu kommen, kommt da eine Datei, die Sie verwenden können, FileSystemWatcher
Polling ist immer Ressourcen-intenstive, besser Hollywood-Prinzip Design-Muster
InformationsquelleAutor Bek Raupov