Was ist eine präzise Art und Weise ein Gewinde für einen bestimmten Zeitraum zu blockieren?

StackOverflow https://stackoverflow.com/questions/1322593

  •  19-09-2019
  •  | 
  •  

Frage

Das System, das ich auf Bedürfnisse gerade arbeite ein IEnumerable von Workitems zu konsumieren, Iterierte durch jeden von ihnen, und zwischen ihnen warten auf einen bestimmten Zeitraum. Ich möchte das System so einfach wie möglich bei der Aufzählung Ort halten. Das heißt, würde Ich mag ein Verfahren haben, dass ich am Ende des foreach-Block aufrufen können, die für die bestimmte Zeit blockieren werde ich angeben - aber ich will nicht Thread.Sleep verwenden, weil es unmöglich ist, zu garantieren Präzision.

Die minimale Menge an Zeit für die ich brauche, würde zu blockieren 100ms ist, aber ich will es nicht länger als diese blockieren, die ich je gesehen habe gelegentlich Thread.Sleep zu tun (ich nehme an, wegen der Zeit in Kontextwechsel genommen, etc).

Edit: Verwandte; ist ein Aufruf an WaitHandle.Wait mit einem Timeout-Wert das gleiche tun wie Thread.Sleep?

War es hilfreich?

Lösung

Warum genau müssen Sie warten, während enumarating?

Wenn eine IEnumerable Sammlung ändert, während Sie durch sie werden du wirst eine Ausnahme erhalten, um in der Tat kann ich keine Artikel von anderen Threads hinzugefügt oder entfernt werden, während Sie Faden daran arbeiten.

Da, warum die künstliche Verzögerung? Nur verbrauchen es, wie es kommt und lassen Sie den Planer die Arbeit unter den Threads verteilen.

Wenn Sie eine wirklich, wirklich genaue Wartezeit möchte ich schlage vor, Sie verwenden ein Thread.Sleep (Zeit - 20 ms). Und dann beschäftigt warten auf den richtigen Zeitpunkt tun, um Ihre Arbeit

Nur Echtzeit-Betriebssystem können Sie eine solche Präzision geben. Sie können davon ausgehen, Thread.Sleep eine Genauigkeit von etwa 20 ms hat, so konnte man in der Theorie schlafen, bis die gewünschte Zeit - die tatsächliche Zeit, etwa 20 ms und dann Spin für 20 ms, aber Sie werden diese 20 ms verschwenden. Und selbst das ist keine Garantie, dass Sie Ergebnisse in Echtzeit erhalten werden, der Scheduler könnte nur gerade Thread herauszunehmen, wenn es um den betreffenden Teil auszuführen (nur nach dem Spinnen)

Andere Tipps

Thread.Sleep () eine Genauigkeit von ca. 20 ms hat, geben oder nehmen. Sie werden etwas besser nicht ohne gehen (unmanaged) Multimedia-Timer bekommen. Und da Sie pausieren nur ein liitle, die viel des Guten zu sein scheint. Versuchen Sie Sleep (80).

. Zusätzlich: alle Timeout-Werte haben, soweit ich weiß, die gleiche Auflösung wie Sleep ()

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top