Bagaimana cara menambahkan penundaan selama 2 atau 3 detik [ditutup]

129

Bagaimana saya bisa menambahkan penundaan ke program di C #?

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

menggali semua
sumber
13
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:

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

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

 public async void ClickHandler(...)
 {
      // whatever you need to do before delay goes here         

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

Cody Grey
sumber
5
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)
Alexei Levenkov
1
@CodyGray selesai.
Alexei Levenkov
39

Untuk 2,3 detik yang harus Anda lakukan:

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

Atau dengan usingpernyataan:

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

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.

Merlyn Morgan-Graham
sumber
2
+1 untuk TimeSpan lebih dari 1000 *
Lefty
Dengan .NET 4 dan seterusnya, Anda dapat menggunakan Thread.Sleep(TimeSpan)secara langsung, tanpa harus menggunakan int.
Holf