Como adicionar um atraso por 2 ou 3 segundos [fechado]

129

Como posso adicionar um atraso a um programa em c #?

Mulder
fonte
2
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 .

digEmAll
fonte
13
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:

  1. System.Timers.Timer
  2. System.Windows.Forms.Timer
  3. System.Threading.Timer

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()).

 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 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.

Cody Gray
fonte
5
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)
Alexei Levenkov
1
@CodyGray done.
Alexei Levenkov
39

Por 2,3 segundos, você deve fazer:

System.Threading.Thread.Sleep(2300);
Mitja Bonca
fonte
6
System.Threading.Thread.Sleep(
    (int)System.TimeSpan.FromSeconds(3).TotalMilliseconds);

Ou com usingdeclaraçõ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.Sleepantes. Documenta melhor sua intenção.

Merlyn Morgan-Graham
fonte
2
+1 para TimeSpan acima de 1000 *
Lefty
Com o .NET 4 em diante, você pode usar Thread.Sleep(TimeSpan)diretamente, sem precisar converter para um int.
Holf