Polling-der richtige Weg?
Ich bin ein software - /hardware-Ingenieur mit einiger Erfahrung in C-und embedded-Technologien. Zurzeit bin ich beschäftigt mit dem schreiben von Applikationen in C# (.NET), die unter Verwendung von hardware für die Datenerfassung. Nun Folgendes, für mich brennende Frage:
Beispiel: ich habe einen Rechner mit einer endswitch zur Bestimmung der endgültigen position einer Achse. Jetzt bin ich mit einem USB-Datenerfassungs-Modul, um die Daten zu Lesen. Derzeit bin ich mit einem Thread ständig Lesen Sie die port-status.
Gibt es keine interrupt-Funktionen auf diesem Gerät.
Meine Frage: Ist das der richtige Weg? Sollte ich verwenden Timer, threads oder Tasks? Ich weiß polling ist etwas, das die meisten von Euch "hassen", aber jede Anregung ist willkommen!
InformationsquelleAutor der Frage Velocity | 2014-04-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
IMO, dies hängt stark von Ihrer genauen Umgebung, aber Erstens - Sie sollten keine Threads mehr, in den meisten Fällen.
Tasks
sind die mehr praktische und leistungsfähige Lösung für, die.Niedrige polling-Frequenz: Timer + polling im
Tick
Veranstaltung:Ein timer ist leicht zu handhaben und zu stoppen. Keine Notwendigkeit, über sorgen, threads/tasks im hintergrund laufen, aber die Handhabung geschieht in der main-thread
Medium polling-Frequenz:
Task
+await Task.Delay(delay)
:await Task.Delay(delay)
nicht sperren eines thread-pool-thread, aber weil der Kontextwechsel die minimale Verzögerung ist ~15msHohe polling-Frequenz:
Task
+Thread.Sleep(delay)
verwendbar bei 1ms Verzögerungen - wir tatsächlich tun, diese Umfrage zu unseren USB-mess-Gerät
Diese könnte wie folgt implementiert werden:
In den meisten Fällen können Sie einfach
Task.Run(() => DoWork(), token)
aber es ist keine überlastung zu liefern, dieTaskCreationOptions.LongRunning
option, die sagt, die task-scheduler, nicht mit einem normalen thread-pool-thread.Aber wie Sie sehen
Tasks
sind einfacher zu handhaben (undawait
können, aber gilt hier nicht). Vor allem das "beenden" ist nur zum telefonierencancellationTokenSource.Cancel()
in dieser Implementierung von überall im code.Können Sie auch teilen diese token in mehrere Aktionen und beenden Sie Sie auf einmal. Auch, noch nicht gestartete Aufgaben werden nicht gestartet, wenn der token wird gelöscht.
Sie können auch fügen Sie eine weitere Aktion, um eine Aufgabe nach einer Aufgabe:
Dieser wird dann ausgeführt, nachdem der listener beendet ist und Sie kann nicht Aufräumen (
t.Exception
enthält eine Ausnahme von den Aufgaben handeln, wenn es nicht erfolgreich war).InformationsquelleAutor der Antwort ChrFin
IMO polling nicht vermieden werden kann.
Was Sie tun können, ist, erstellen Sie ein Modul, mit seinen unabhängigen thread/Task, der eine Umfrage der port regelmäßig. Basierend auf der änderung von Daten, die in diesem Modul wird das Ereignis ausgelöst, die behandelt werden von den Konsum-Anwendungen
InformationsquelleAutor der Antwort Manish Dalal