Existem várias maneiras de fazer isso, mas por que você precisa adicionar um atraso? Se soubéssemos, poderíamos sugerir a maneira mais apropriada de fazê-lo.
ChrisF
3
Esta questão está irremediavelmente sub-documentada para recomendar o Thread.Sleep ().
Hans Passant 27/03
1
Apenas para esclarecimento, votei em encerrar esta pergunta porque você não forneceu detalhes suficientes para que alguém desse uma resposta boa e de qualidade. Estou perfeitamente disposto a reabri-lo como uma pergunta válida se você adicionar mais alguns detalhes sobre exatamente o que está tentando fazer. A votação para fechar mais cedo é uma maneira de impedir uma enxurrada de respostas "barulhentas" para perguntas de baixa qualidade. Depois de adicionar mais detalhes, deixe-me um comentário e / ou sinalize um mod para reabri-lo.
Cody Gray
14
Má decisão para encerrar esta pergunta. É uma pergunta e não há problema em ser genérico por natureza. Eu entendi perfeitamente.
user2430797
5
Outra pergunta que eu estava procurando, respondida por uma pergunta que foi encerrada sem motivo.
Glenn Maynard
Respostas:
176
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 .
Evite usar Thead.Sleep cause Isso bloqueará completamente o Thread atual de fazer QUALQUER COISA até que a duração termine.
Mohammed Swillam 27/03
7
@ Mohammed: sim, é claro que irá bloquear completamente o piso. Mas, às vezes, pode ser útil ... realmente depende do que o OP precisa ...
digEmAll
12
Como não consigo postar uma nova resposta, gostaria de comentar - Se você não deseja que ele bloqueie o programa, você pode usá-lo await Task.Delay(milliseconds). Isso funcionou para mim :)
SaiyanGirl
No meu caso, eu não poderia esperar, porque fui chamado de uma parte do programa que foi escrita por outra pessoa. Não é aguardável, mas se eu "travar", posso trabalhar por 10 segundos antes que minhas coisas sejam desligadas. Dormir 2 segundos funciona como um encanto;) Então, em alguns casos, esse é o caminho.
ecth
@MohammedElSayed: A resposta é depende. Tudo depende da intenção do uso. Quanto ao meu caso, preciso reter o encadeamento por 0,6 segundos precisamente para evitar uma restrição de índice ao inserir no banco de dados.
GunWanderer
61
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.Sleepse seu aplicativo precisar processar qualquer entrada nesse thread ao mesmo tempo (WinForms, WPF), pois Sleepele 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 Sleepvocê pode usar a Task.Delayversão assíncrona Sleepque não impede o encadeamento de processar eventos (se usado corretamente - não o transforme em suspensão infinita .Wait()).
publicasyncvoidClickHandler(...){// whatever you need to do before delay goes here awaitTask.Delay(2000);// whatever you need to do after delay.}
O mesmo await Task.Delay(2000)pode ser usado no Mainmé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 Sleeptem 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.
Se for um aplicativo de console, o Thread.Sleepaviso pode não ser tão importante.
Merlyn Morgan-Graham
1
Existe um quarto temporizador: System.Web.UI.Timer , um componente do ASP.NET que executa postagens assíncronas ou síncronas de páginas da Web em intervalos regulares.
David
1
Deve ser a melhor resposta. Se isso tivesse um exemplo para o uso de um dos temporizadores, obteria mais votos ...
Mercutio
Cody Gray, você pode adicionar 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)
Eu prefiro isso 1000 * numSeconds(ou simplesmente 3000) porque torna mais óbvio o que está acontecendo com alguém que nunca usou Thread.Sleepantes. Documenta melhor sua intenção.
Respostas:
Você pode usar a
Thread.Sleep()
função, por exemploque 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:Para outros cenários (por exemplo, iniciar operações após algum tempo etc.), verifique a resposta de Cody .
fonte
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:
System.Timers.Timer
System.Windows.Forms.Timer
System.Threading.Timer
Não use
Thread.Sleep
se seu aplicativo precisar processar qualquer entrada nesse thread ao mesmo tempo (WinForms, WPF), poisSleep
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émTask.Delay
é a melhor opção).Além dos timers e
Sleep
você pode usar aTask.Delay
versão assíncronaSleep
que não impede o encadeamento de processar eventos (se usado corretamente - não o transforme em suspensão infinita.Wait()
).O mesmo
await Task.Delay(2000)
pode ser usado noMain
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.fonte
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 usoSleep
(não assíncronaMain
) ouDelay
(assíncronoMain
)Por 2,3 segundos, você deve fazer:
fonte
Ou com
using
declarações:Eu prefiro isso
1000 * numSeconds
(ou simplesmente3000
) porque torna mais óbvio o que está acontecendo com alguém que nunca usouThread.Sleep
antes. Documenta melhor sua intenção.fonte
Thread.Sleep(TimeSpan)
diretamente, sem precisar converter para um int.