2013-04-14 12 views
15

Ciao Sto cercando di trovare un metodo di aspettare un numero di millisecondi prima di passare alla riga successiva di codice,Attendere n secondi, poi la prossima linea di codice senza congelare forma

Ho esaminato Thread.Sleep ma questo congelerà la forma principale, vorrei che rimanesse attivo.

Ho provato i timer ei cronometri ed entrambi congelano il modulo principale quando devono essere inviati su una console quando spuntano.

Non ho trovato il modo di utilizzare task.delay o background worker nell'attesa che volevo.

pseudo codice:

Wait 2 - 6 seconds 
Log "waiting" 
Log "waiting" 
Log "waiting" 
Stop Waiting - Run next line of code. 

I metodi che ho provato appena congelare il modulo e compilare il registro dopo, voglio solo un metodo semplice di aspettare senza congelare la forma e senza avere a che fare con gli eventi di essere chiamato che significherebbe che la riga successiva non viene eseguita.

Qualsiasi aiuto sarebbe fantastico, perché io sono ancora nuovo per C# e il suo mi ha stato alla guida di un po 'matto :(

+0

È WinForms o WPF? – outcoldman

+0

Applicazione Windows Form – Sam

risposta

25

Il await parola chiave, in combinazione con Task.Delay rende questo banale.

public async Task Foo() 
{ 
    await Task.Delay(2000); 
    txtConsole.AppendText("Waiting..."); 
    DoStuff(); 
} 
+0

Grazie a tutto ciò di cui avevo bisogno, avevo provato il Task.Delay ma non ero consapevole di doverlo usare in combinazione con "Task asincrona" e "attendere" – Sam

+3

@Sam Certamente non lo * dovere. Potresti usare 'Task.Delay (2000) .ContinueWith (t => DoStuff(), ..., Task.Factory.FromCurrentSynchronizationContext());' invece, che è ciò che l'attesa attirerà alla fine. – Servy

+0

Che funziona benissimo quindi sono felice :) Grazie ancora! – Sam

3

Provare a utilizzare un DispatcherTimer. E' un oggetto piuttosto comodo che fa tutto il lavoro di delegare alla UI filo

ad esempio:..

private DispatcherTimer _dtTimer = null; 

public Constructor1(){ 
    _dtTimer = new DispatcherTimer(); 
    _dtTimer.Tick += new System.EventHandler(HandleTick); 
    _dtTimer.Interval = new TimeSpan(0, 0, 0, 2); //Timespan of 2 seconds 
    _dtTimer.Start(); 
} 

private void HandleTick(object sender, System.EventArgs e) { 
    _uiTextBlock.Text = "Timer ticked!"; 
} 
0

Timer dovrebbe funzionare bene in questo caso, a meno che non si mette Thread.Sleep nel suo gestore o il gestore si prende troppo tempo per completare

Non hai specificato il framework UI che usi o .Net versione, ma per l'ultimo .Net puoi usare async/await. In questo modo, l'interfaccia utente non sarebbe stato congelato, mentre il codice attende per l'attività in background

void async MyMethod() 
{ 
    var result = await Task.Run(() => long_running_code); 
}