Ada beberapa cara untuk melakukan ini, tetapi mengapa Anda perlu menambahkan penundaan? Jika kami tahu maka kami akan dapat menyarankan cara yang paling tepat untuk melakukannya.
ChrisF
3
Pertanyaan ini sangat tidak terdokumentasi untuk merekomendasikan Thread.Sleep ().
Hans Passant
1
Hanya untuk klarifikasi, saya memilih untuk menutup pertanyaan ini karena Anda belum memberikan detail yang cukup bagi siapa pun untuk memberikan jawaban yang baik dan berkualitas. Saya sangat bersedia untuk membukanya kembali sebagai pertanyaan yang valid jika Anda menambahkan lebih detail tentang apa yang Anda coba lakukan. Memilih untuk menutup lebih awal adalah cara mencegah membanjirnya jawaban "berisik" untuk pertanyaan-pertanyaan berkualitas rendah. Setelah Anda menambahkan lebih detail, beri saya komentar dan / atau beri tanda mod untuk membukanya kembali.
Cody Gray
14
Keputusan buruk untuk menutup pertanyaan ini. Itu ADALAH pertanyaan, dan itu boleh saja sifatnya generik. Saya memahaminya dengan sempurna.
user2430797
5
Namun pertanyaan lain yang saya cari, dijawab oleh pertanyaan yang ditutup tanpa alasan.
Glenn Maynard
Jawaban:
177
Anda dapat menggunakan Thread.Sleep()fungsi, mis
int milliseconds =2000;Thread.Sleep(milliseconds);
yang sepenuhnya menghentikan eksekusi utas saat ini selama 2 detik.
Mungkin skenario yang paling tepat untuk Thread.Sleepadalah ketika Anda ingin menunda operasi di utas lain, berbeda dari utama misalnya:
MAIN THREAD --------------------------------------------------------->(UI, CONSOLE ETC.)||||
OTHER THREAD ----- ADD A DELAY (Thread.Sleep)------>
Untuk skenario lain (mis. Memulai operasi setelah beberapa waktu dll.) Periksa jawaban Cody .
Hindari penggunaan Thead. Penyebab tidur Ini akan sepenuhnya memblokir Thread saat ini untuk melakukan APA SAJA hingga durasinya berakhir.
Mohammed Swillam
7
@Mohammed: ya, tentu saja itu akan sepenuhnya memblokir tapak. Tapi kadang-kadang itu bisa berguna ... itu benar-benar tergantung pada apa yang dibutuhkan OP ...
digEmAll
12
Karena saya tidak dapat memposting jawaban baru, saya ingin berkomentar - Jika Anda tidak ingin memblokir program, Anda dapat menggunakannya await Task.Delay(milliseconds). Ini bekerja untuk saya :)
SaiyanGirl
Dalam kasus saya, saya tidak bisa menggunakan menunggu karena saya dipanggil dari bagian program yang ditulis oleh orang lain. Ini tidak bisa ditunggu tetapi jika saya "menggantung" saya dapat bekerja selama 10 detik sebelum barang saya ditutup. Tidur 2 detik berfungsi seperti pesona;) Jadi, dalam beberapa kasus, inilah caranya.
ecth
@MohammedElSayed: Jawabannya tergantung. Itu semua tergantung pada niat penggunaannya. Adapun kasus saya, saya perlu tidur utas selama 0,6 detik tepat untuk menghindari kendala indeks saat memasukkan ke dalam database.
GunWanderer
61
Gunakan timer dengan interval yang diatur ke 2–3 detik.
Anda memiliki tiga opsi berbeda untuk dipilih, tergantung pada jenis aplikasi yang Anda tulis:
Jangan gunakan Thread.Sleepjika aplikasi Anda perlu memproses input apa pun pada utas itu secara bersamaan (WinForms, WPF), karena Sleepakan sepenuhnya mengunci utas dan mencegahnya memproses pesan lainnya. Dengan asumsi aplikasi single-threaded (seperti kebanyakan), seluruh aplikasi Anda akan berhenti merespons, bukan hanya menunda operasi seperti yang mungkin Anda maksudkan. Perhatikan bahwa mungkin baik-baik saja untuk menggunakan Sleep di aplikasi konsol murni karena tidak ada "acara" untuk menangani atau pada utas terpisah (juga Task.Delaymerupakan pilihan yang lebih baik).
Selain penghitung waktu dan SleepAnda dapat menggunakan Task.Delayversi asinkron Sleepyang tidak memblokir utas dari pemrosesan acara (jika digunakan dengan benar - jangan mengubahnya menjadi tidur tanpa batas dengan .Wait()).
publicasyncvoidClickHandler(...){// whatever you need to do before delay goes here awaitTask.Delay(2000);// whatever you need to do after delay.}
Hal yang sama await Task.Delay(2000)dapat digunakan dalam Mainmetode aplikasi konsol jika Anda menggunakan C # 7.1 ( utama Async di blog MSDN ).
Catatan: menunda operasi dengan Sleepmanfaat menghindari kondisi balapan yang berasal dari kemungkinan memulai beberapa operasi dengan timer / Delay. Sayangnya pembekuan aplikasi berbasis UI tidak dapat diterima sehingga Anda perlu memikirkan apa yang akan terjadi jika Anda memulai beberapa penundaan (yaitu jika dipicu oleh klik tombol) - pertimbangkan untuk menonaktifkan tombol tersebut, atau membatalkan timer / tugas atau memastikan tertunda operasi dapat dilakukan beberapa kali dengan aman.
Jika itu adalah aplikasi konsol, Thread.Sleepperingatan itu mungkin tidak sepenting itu.
Merlyn Morgan-Graham
1
Ada timer ke-4: System.Web.UI.Timer , komponen ASP.NET yang melakukan postback halaman web asinkron atau sinkron pada interval reguler.
David
1
Harus menjadi jawaban teratas. Jika ini memiliki contoh untuk menggunakan salah satu timer, itu akan mendapatkan lebih banyak suara ...
Mercutio
Cody Grey, dapatkah Anda menambahkan await Task.Delay()komentar versi dan inline bahwa aplikasi konsol sebenarnya mungkin ingin menggunakan Sleep(non-async Main) atau Delay(async Main)
Saya lebih suka ini 1000 * numSeconds(atau hanya 3000) karena membuatnya lebih jelas apa yang terjadi pada seseorang yang belum pernah menggunakan Thread.Sleepsebelumnya. Lebih baik mendokumentasikan niat Anda.
Jawaban:
Anda dapat menggunakan
Thread.Sleep()
fungsi, misyang sepenuhnya menghentikan eksekusi utas saat ini selama 2 detik.
Mungkin skenario yang paling tepat untuk
Thread.Sleep
adalah ketika Anda ingin menunda operasi di utas lain, berbeda dari utama misalnya:Untuk skenario lain (mis. Memulai operasi setelah beberapa waktu dll.) Periksa jawaban Cody .
sumber
await Task.Delay(milliseconds)
. Ini bekerja untuk saya :)Gunakan timer dengan interval yang diatur ke 2–3 detik.
Anda memiliki tiga opsi berbeda untuk dipilih, tergantung pada jenis aplikasi yang Anda tulis:
System.Timers.Timer
System.Windows.Forms.Timer
System.Threading.Timer
Jangan gunakan
Thread.Sleep
jika aplikasi Anda perlu memproses input apa pun pada utas itu secara bersamaan (WinForms, WPF), karenaSleep
akan sepenuhnya mengunci utas dan mencegahnya memproses pesan lainnya. Dengan asumsi aplikasi single-threaded (seperti kebanyakan), seluruh aplikasi Anda akan berhenti merespons, bukan hanya menunda operasi seperti yang mungkin Anda maksudkan. Perhatikan bahwa mungkin baik-baik saja untuk menggunakan Sleep di aplikasi konsol murni karena tidak ada "acara" untuk menangani atau pada utas terpisah (jugaTask.Delay
merupakan pilihan yang lebih baik).Selain penghitung waktu dan
Sleep
Anda dapat menggunakanTask.Delay
versi asinkronSleep
yang tidak memblokir utas dari pemrosesan acara (jika digunakan dengan benar - jangan mengubahnya menjadi tidur tanpa batas dengan.Wait()
).Hal yang sama
await Task.Delay(2000)
dapat digunakan dalamMain
metode aplikasi konsol jika Anda menggunakan C # 7.1 ( utama Async di blog MSDN ).Catatan: menunda operasi dengan
Sleep
manfaat menghindari kondisi balapan yang berasal dari kemungkinan memulai beberapa operasi dengan timer /Delay
. Sayangnya pembekuan aplikasi berbasis UI tidak dapat diterima sehingga Anda perlu memikirkan apa yang akan terjadi jika Anda memulai beberapa penundaan (yaitu jika dipicu oleh klik tombol) - pertimbangkan untuk menonaktifkan tombol tersebut, atau membatalkan timer / tugas atau memastikan tertunda operasi dapat dilakukan beberapa kali dengan aman.sumber
Thread.Sleep
peringatan itu mungkin tidak sepenting itu.await Task.Delay()
komentar versi dan inline bahwa aplikasi konsol sebenarnya mungkin ingin menggunakanSleep
(non-asyncMain
) atauDelay
(asyncMain
)Untuk 2,3 detik yang harus Anda lakukan:
sumber
Atau dengan
using
pernyataan:Saya lebih suka ini
1000 * numSeconds
(atau hanya3000
) karena membuatnya lebih jelas apa yang terjadi pada seseorang yang belum pernah menggunakanThread.Sleep
sebelumnya. Lebih baik mendokumentasikan niat Anda.sumber
Thread.Sleep(TimeSpan)
secara langsung, tanpa harus menggunakan int.