Como posso adicionar um atraso a um programa em c #?
Como posso adicionar um atraso a um programa em c #?
Respostas:
Você pode usar a Thread.Sleep()
função, por exemplo
int milliseconds = 2000;
Thread.Sleep(milliseconds);
que interrompe completamente a execução do encadeamento atual por 2 segundos.
Provavelmente, o cenário mais apropriado Thread.Sleep
é quando você deseja atrasar as operações em outro encadeamento, diferente do principal, por exemplo:
MAIN THREAD --------------------------------------------------------->
(UI, CONSOLE ETC.) | |
| |
OTHER THREAD ----- ADD A DELAY (Thread.Sleep) ------>
Para outros cenários (por exemplo, iniciar operações após algum tempo etc.), verifique a resposta de Cody .
await Task.Delay(milliseconds)
. Isso funcionou para mim :)
Use um cronômetro com um intervalo definido para 2 a 3 segundos.
Você tem três opções diferentes para escolher, dependendo do tipo de aplicativo que está escrevendo:
Não use Thread.Sleep
se seu aplicativo precisar processar qualquer entrada nesse thread ao mesmo tempo (WinForms, WPF), pois Sleep
ele trancará completamente o thread e impedirá que ele processe outras mensagens. Supondo que um aplicativo de thread único (como a maioria), todo o aplicativo parará de responder, em vez de apenas atrasar uma operação como você provavelmente pretendia. Observe que pode ser bom usar o modo de suspensão no aplicativo de console puro, pois não há "eventos" para manipular ou em um thread separado (também Task.Delay
é a melhor opção).
Além dos timers e Sleep
você pode usar a Task.Delay
versão assíncrona Sleep
que não impede o encadeamento de processar eventos (se usado corretamente - não o transforme em suspensão infinita .Wait()
).
public async void ClickHandler(...)
{
// whatever you need to do before delay goes here
await Task.Delay(2000);
// whatever you need to do after delay.
}
O mesmo await Task.Delay(2000)
pode ser usado no Main
método de um aplicativo de console se você usar o C # 7.1 ( Async main nos blogs do MSDN ).
Nota: atrasar a operação com Sleep
tem o benefício de evitar condições de corrida resultantes do início potencial de várias operações com temporizadores / Delay
. Infelizmente, o congelamento de aplicativos baseados na interface do usuário não é aceitável, portanto, é necessário pensar no que acontecerá se você iniciar vários atrasos (por exemplo, se for acionado por um clique no botão) - considere desativar esse botão ou cancelar o cronômetro / tarefa ou verificar atrasos A operação pode ser feita várias vezes com segurança.
Thread.Sleep
aviso pode não ser tão importante.
await Task.Delay()
a versão e comentário em linha que console app realmente provável quer para uso Sleep
(não assíncrona Main
) ou Delay
(assíncrono Main
)
Por 2,3 segundos, você deve fazer:
System.Threading.Thread.Sleep(2300);
System.Threading.Thread.Sleep(
(int)System.TimeSpan.FromSeconds(3).TotalMilliseconds);
Ou com using
declarações:
Thread.Sleep((int)TimeSpan.FromSeconds(2).TotalMilliseconds);
Eu prefiro isso 1000 * numSeconds
(ou simplesmente 3000
) porque torna mais óbvio o que está acontecendo com alguém que nunca usou Thread.Sleep
antes. Documenta melhor sua intenção.
Thread.Sleep(TimeSpan)
diretamente, sem precisar converter para um int.