2 veya 3 saniyelik bir gecikme nasıl eklenir [kapalı]


129

C # 'da bir programa nasıl gecikme ekleyebilirim?


2
Bunu yapmanın birkaç yolu var, ancak neden bir gecikme eklemeniz gerekiyor? Bilseydik, bunu yapmanın en uygun yolunu önerebilirdik.
ChrisF

3
Bu soru, Thread.Sleep () 'i önerecek kadar az belgelenmiştir.
Hans Passant

1
Sadece açıklama için, bu soruyu kapatmaya oy verdim çünkü kimsenin iyi ve kaliteli bir cevap vermesi için yeterli ayrıntı sağlamadınız. Tam olarak ne yapmaya çalıştığınıza dair biraz daha ayrıntı eklerseniz, onu geçerli bir soru olarak yeniden açmaya tamamen hazırım. Erken kapatma oylaması, kalitesiz sorulara verilen "gürültü" selini önlemenin bir yoludur. Daha fazla ayrıntı ekledikten sonra, bana bir yorum bırakın ve / veya yeniden açılması için bir modu işaretleyin.
Cody Grey

14
Bu soruyu kapatmak için yanlış bir karar. Bu bir sorudur ve doğası gereği jenerik olması normaldir. Mükemmel anladım.
user2430797

5
Yine de aradığım başka bir soru, sebepsiz yere kapatılan bir soruyla cevaplandı.
Glenn Maynard

Yanıtlar:


177

Thread.Sleep()Fonksiyonu kullanabilirsiniz , örneğin

int milliseconds = 2000;
Thread.Sleep(milliseconds);

bu , geçerli iş parçacığının yürütülmesini 2 saniye boyunca tamamen durdurur .

Muhtemelen en uygun senaryo Thread.Sleep, başka bir iş parçacığındaki işlemleri ertelemek istediğinizde, ana olandan farklıdır, örn:

 MAIN THREAD        --------------------------------------------------------->
 (UI, CONSOLE ETC.)      |                                      |
                         |                                      |
 OTHER THREAD            ----- ADD A DELAY (Thread.Sleep) ------>

Diğer senaryolar için (örneğin bir süre sonra işlemlere başlama vb.) Cody'nin cevabını kontrol edin .


13
Thead.Sleep kullanmaktan kaçının çünkü Mevcut Thread'ın süre bitene kadar HERHANGİ BİR ŞEY yapmasını tamamen engelleyecektir.
Muhammed Swillam

7
@Mohammed: evet, elbette sırtını tamamen bloke edecek. Ama bazen faydalı olabilir ... gerçekten OP'nin neye ihtiyacı olduğuna bağlıdır ...
digEmAll

12
Yeni bir cevap gönderemediğim için yorum yapmak istiyorum - Programı engellemesini istemiyorsanız kullanabilirsiniz await Task.Delay(milliseconds). Bu benim için çalıştı :)
SaiyanGirl

Benim durumumda await'i kullanamadım çünkü programın başka biri tarafından yazılmış bir bölümünden çağrıldım. Beklenebilir değil ama "takılırsam" eşyalarım kapanmadan önce 10 saniye çalışabilirim. 2 saniye uyumak bir cazibe gibi çalışır;) Yani bazı durumlarda yol budur.
ecth

@MohammedElSayed: Cevap bağlıdır. Her şey kullanım amacına bağlıdır. Benim durumuma gelince, veritabanına eklerken bir dizin kısıtlamasından kaçınmak için iş parçacığını tam olarak 0,6 saniye uyutmam gerekiyor.
GunWanderer

61

Aralığı 2–3 saniyeye ayarlanmış bir zamanlayıcı kullanın.

Yazmakta olduğunuz uygulama türüne bağlı olarak seçebileceğiniz üç farklı seçeneğiniz vardır:

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

Kullanmayın Thread.SleepBaşvurunuz ihtiyacı (WinForms, WPF) aynı zamanda bu iş parçacığı üzerinde herhangi girişler işlemek için eğer olarak Sleeptamamen ipliği kilitlemek ve diğer mesajları işlemesini engeller. Tek iş parçacıklı bir uygulama varsayıldığında (çoğu olduğu gibi), muhtemelen istediğiniz gibi bir işlemi geciktirmek yerine tüm uygulamanız yanıt vermeyi durduracaktır. İşlenecek veya ayrı iş parçacığı üzerinde "olay" olmadığı için (ayrıca Task.Delaydaha iyi bir seçenektir) , tamamen konsol uygulamasında Uyku kullanmanın iyi olabileceğini unutmayın .

Zamanlayıcılara ek olarak ve iş parçacığının olayları işlemesini engellemeyen eşzamansız sürümünü Sleepkullanabilirsiniz (doğru kullanılırsa - sonsuz uykuya çevirmeyin ).Task.DelaySleep.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.
 }

Aynısı await Task.Delay(2000)birMainC # 7.1 ( MSDN bloglarında Async main ) kullanıyorsanız, bir konsol uygulaması yönteminde .

Not: ile işlemi geciktirmek Sleep, potansiyel olarak zamanlayıcılar / ile birden fazla işlem başlatmaktan kaynaklanan yarış koşullarından kaçınma avantajına sahiptir Delay. Maalesef UI tabanlı uygulamanın dondurulması kabul edilemez, bu nedenle birden fazla gecikme başlatırsanız (yani bir düğme tıklamasıyla tetiklenirse) ne olacağını düşünmeniz gerekir - bu tür düğmeyi devre dışı bırakmayı veya zamanlayıcıyı / görevi iptal etmeyi veya geciktirildiğinden emin olmayı düşünün operasyon birden çok kez güvenle yapılabilir.


5
Bir konsol uygulamasıysa, Thread.Sleepuyarı o kadar önemli olmayabilir.
Merlyn Morgan-Graham

1
4. bir zamanlayıcı vardır: System.Web.UI.Timer , düzenli aralıklarla zaman uyumsuz veya zaman uyumlu web sayfası geri göndermeleri gerçekleştiren bir ASP.NET bileşeni.
David

1
En iyi cevap olmalı. Bunun zamanlayıcılardan birini kullanmak için bir örneği olsaydı, daha fazla oy alırdı ...
Mercutio

Cody Gray, await Task.Delay()konsol uygulamasının gerçekten kullanmak isteyeceğiSleep (eşzamansız olmayan Main) veya Delay(eşzamansız Main) sürüm ve satır içi yorum ekleyebilir misiniz?
Alexei Levenkov

1
@CodyGray bitti.
Alexei Levenkov

39

2.3 saniye boyunca şunları yapmalısınız:

System.Threading.Thread.Sleep(2300);

6
System.Threading.Thread.Sleep(
    (int)System.TimeSpan.FromSeconds(3).TotalMilliseconds);

Veya usingifadelerle:

Thread.Sleep((int)TimeSpan.FromSeconds(2).TotalMilliseconds);

Bunu 1000 * numSeconds(veya basitçe 3000) tercih ederim çünkü daha Thread.Sleepönce kullanmamış birine neler olup bittiğini daha açık hale getiriyor . Niyetinizi daha iyi belgeler.


2
1000'in üzerinde TimeSpan için +1 *
Lefty

NET 4 ile birlikte Thread.Sleep(TimeSpan), bir int'e çevrim yapmanıza gerek kalmadan doğrudan kullanabilirsiniz .
Holf
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.