2009-08-24 5 views
1

Das System, an dem ich gerade arbeite, muss IEnumerable von Arbeitselementen konsumieren, iterieren und dazwischen warten sie jeweils eine bestimmte Zeit lang. Ich möchte das System an der Aufzählungsstelle so einfach wie möglich halten. Das heißt, ich hätte gerne eine Methode, die ich am Ende des Foreach-Blocks aufrufen kann, die für die angegebene bestimmte Zeit blockiert - aber ich möchte Thread.Sleep nicht verwenden, weil es unmöglich ist, dies zu garantieren Präzision.Was ist eine präzise Möglichkeit, einen Thread für einen bestimmten Zeitraum zu blockieren?

Die minimale Zeit, die ich blockieren muss, ist 100ms, aber ich möchte nicht länger blockieren als das, was ich Thread.Sleep gelegentlich gesehen habe (ich nehme an, wegen der Zeit in Kontextwechsel usw.).

Bearbeiten: In Verbindung stehende; Führt ein Aufruf von WaitHandle.Wait mit einem Zeitüberschreitungswert dasselbe wie Thread.Sleep aus?

Antwort

2

Warum genau müssen Sie beim Enumulieren warten?

Wenn eine IEnumerable-Sammlung sich ändert, während Sie sie durchlaufen, erhalten Sie eine Ausnahme, sodass in der Tat keine Elemente von anderen Threads hinzugefügt oder entfernt werden können, während Sie daran arbeiten.

Angesichts, warum die künstliche Verzögerung? Nimm es einfach so auf, wie es kommt und lass den Scheduler die Arbeit unter deinen Threads verteilen.

Wenn Sie eine wirklich sehr genaue Wartezeit wollen, schlage ich vor, Sie verwenden einen Thread.Sleep (Zeit - 20 ms) und dann beschäftigt warten auf den richtigen Zeitpunkt, um Ihre Arbeit zu erledigen.

Nur Echtzeit-Betriebssystem kann Ihnen eine solche Präzision geben. Sie können davon ausgehen, dass Thread.Sleep eine Genauigkeit von etwa 20 ms hat, so dass Sie theoretisch bis zur gewünschten Zeit schlafen können - die tatsächliche Zeit beträgt etwa 20 ms und THEN spin für 20 ms, aber Sie müssen diese 20 ms verschwenden. Und selbst das garantiert nicht, dass Sie Echtzeitergebnisse erhalten. Der Scheduler könnte Ihren Thread gerade herausnehmen, wenn er den RELEVANT-Teil (gerade nach dem Drehen) ausführt.

+0

"active wait"? –

+0

Btw - Ich will wirklich wirklich, wonach ich frage. =) –

+0

Man kann nie wissen :) Active wait ist eine sehr schlechte Übersetzung von "espera activa", wie man es auf Spanisch kennt: P ... Korrigiert zu "Busy Wait" –

3

Thread.Sleep() hat eine Genauigkeit von ca. 20ms, geben oder nehmen. Sie werden nichts besseres bekommen, wenn Sie nicht (nicht verwaltete) Multimedia-Timer verwenden. Und da du gerade ein bisschen anhast, das übertrieben erscheint. Versuche Schlaf (80).

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

Verwandte Themen