2013-04-10 25 views
12

voglio mettere un ritardo tra 2 operazioni senza tenendo occupato il filoasincrono Thread.Sleep()

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

Il filo deve uscire dopo worka ed eseguire workB (magari in un nuovo thread) con un certo ritardo.

Mi chiedo se è possibile qualche equevalent di questo pseudocodice

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

modificare Il mio programma è in NET 2.0

Edit 2: evento System.Timers.Timer.Elapsed alzerà l'evento dopo 1000 ms. Non so se il thread del timer sarà occupato per 1000 ms. (Così io non guadagno economia filo)

+0

Non capisco. La tua chiamata Thread.Sleep() metterà un ritardo tra 2 operazioni senza tenere occupato il thread. Frainteso cosa vuoi? –

+0

Sì, ma il Threadpool per questo periodo di tempo (1000 ms) avrà 1 thread in meno disponibile. – albert

+1

Si potrebbe preferire 'System.Threading.Timer' per questo - non' System.Timers.Timer' e no - non c'è "thread del timer" - l'attesa è controllata nel kernel del sistema operativo –

risposta

28

vuoi dire:

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

In alternativa, creare un Timer manualmente.

Nota questo sembra più bella in async codice:

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

edit: con il .NET 2.0 di aggiornamento, si dovrebbe configurare il proprio Timer con callback. Esiste un pacchetto nuget System.Threading.Tasks che porta l'API Task in .NET 3.5, ma a: non va a 2.0 e b: Non penso che includa Task.Delay.

+0

o anche 'Task.Delay (1000) .Wait();' se non vuoi una funzione asincrona. –

+3

@Josh mi hai solo fatto piangere un po '. Per favore, non farlo mai. Se sei fortunato sarà semplicemente orribilmente inefficiente. Se sei sfortunato: hai appena bloccato un thread. Tutto dipende dal contesto di sincronizzazione. Se si desidera attendere in modo sincrono: 'Thread.Sleep (1000)' –

+1

grazie per la risposta, non credo che tu abbia un posto dove potrei andare a leggere di più su questo (il perché intendo)? (in particolare il deadlock della parte thread) –