2013-04-10 12 views
12

Ich möchte eine Verzögerung zwischen zwei Operationen setzen, ohne damit beschäftigt halten den FadenAsynchronous Thread.Sleep()

workA(); 
Thread.Sleep(1000); 
workB(); 

Der Thread nach worka verlassen muss und WORKB ausführen (vielleicht in einem neuen Thread) nach einer gewissen Verzögerung.

Ich frage mich, ob es einige equevalent dieses Pseudo-Code möglich ist

workA(); 
Thread.BeginSleep(1000, workB); // callback 

bearbeiten Mein Programm ist in .NET 2.0

bearbeiten 2: System.Timers.Timer.Elapsed Ereignis das Ereignis auslösen wird nach 1000 ms. Ich weiß nicht, ob der Timer-Thread für 1000 ms beschäftigt ist. (So ​​dont ich Faden Wirtschaft gewinnen)

+0

Verstehe nicht. Ihr Thread.Sleep() -Aufruf wird eine Verzögerung zwischen 2 Vorgängen setzen, ohne den Thread beschäftigt zu sein. Missverstehe ich was du willst? –

+0

Ja, aber der Threadpool für diesen Zeitraum (1000 ms) wird 1 Thread weniger verfügbar haben. – albert

+1

Sie könnten dafür "System.Threading.Timer" bevorzugen - nicht "System.Timers.Timer" und nein - es gibt kein "Timer-Thread" - die Wartezeit wird im Betriebssystemkernel gesteuert –

Antwort

28

Meinten Sie:

Task.Delay(1000).ContinueWith(t => workB()); 

Alternativ erstellen Timer manuell.

Hinweis: dieser hübschere in async Code sieht:

async Task Foo() { 
    workA(); 
    await Task.Delay(1000); 
    workB(); 
} 

edit: mit .NET 2.0-Update, Sie würden Ihr eigenes Timer mit Rückruf-Setup haben. Es gibt ein Nuget-Paket System.Threading.Tasks, das die API Task auf .NET 3.5 herunterbringt, aber a: es geht nicht auf 2.0, und b: Ich glaube nicht, dass es Task.Delay enthält.

+0

oder sogar 'Task.Delay (1000) .Wait();' Wenn Sie nicht möchten, eine asynchrone Funktion. –

+3

@Josh Du hast mich nur ein bisschen zum weinen gebracht. Bitte tu das niemals. Wenn Sie Glück haben, wird es einfach furchtbar ineffizient sein. Wenn Sie Pech haben: Sie haben gerade einen Thread blockiert. Alles hängt vom Synchronisierungskontext ab. Wenn Sie synchron warten wollen: 'Thread.Sleep (1000)' –

+1

danke für die Antwort, ich nehme an, Sie haben nirgendwo ich könnte lesen Sie mehr darüber (das, warum ich meine)? (vor allem die Deadlock der Thread-Teil) –