C # 'da bir programa nasıl gecikme ekleyebilirim?
C # 'da bir programa nasıl gecikme ekleyebilirim?
Yanıtlar:
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 .
await Task.Delay(milliseconds)
. Bu benim için çalıştı :)
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:
Kullanmayın Thread.Sleep
Başvurunuz ihtiyacı (WinForms, WPF) aynı zamanda bu iş parçacığı üzerinde herhangi girişler işlemek için eğer olarak Sleep
tamamen 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.Delay
daha 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ü Sleep
kullanabilirsiniz (doğru kullanılırsa - sonsuz uykuya çevirmeyin ).Task.Delay
Sleep
.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)
birMain
C # 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.
Thread.Sleep
uyarı o kadar önemli olmayabilir.
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?
2.3 saniye boyunca şunları yapmalısınız:
System.Threading.Thread.Sleep(2300);
System.Threading.Thread.Sleep(
(int)System.TimeSpan.FromSeconds(3).TotalMilliseconds);
Veya using
ifadelerle:
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.
Thread.Sleep(TimeSpan)
, bir int'e çevrim yapmanıza gerek kalmadan doğrudan kullanabilirsiniz .