Setelah memanggil sleep dalam suatu metode, apakah program akan terus dijalankan di latar belakang (tanpa membuat utas baru)? Juga, jika saya sebut sleep di utas baru, akankah utas utama melanjutkan kerjanya?
Jay Nirgudkar
@JayNirgudkar utas yang menyebut Sleep akan dihentikan. Utas lainnya tidak terpengaruh.
Isak Savo
Ini tidak dijamin akurat.
Akumaburn
150
Pada dasarnya ada 3 pilihan untuk menunggu (hampir) bahasa pemrograman:
Longgar menunggu
Menjalankan blok ulir untuk waktu tertentu (= tidak mengkonsumsi daya pemrosesan)
Tidak ada pemrosesan yang dimungkinkan pada utas yang diblokir / menunggu
Tidak terlalu tepat
Tight waiting (disebut juga loop ketat)
Prosesor sangat sibuk untuk seluruh interval menunggu (pada kenyataannya, biasanya menghabiskan 100% dari waktu pemrosesan satu inti)
Beberapa tindakan dapat dilakukan sambil menunggu
Sangat tepat
Kombinasi 2 sebelumnya
Biasanya menggabungkan efisiensi pemrosesan 1. dan ketepatan + kemampuan untuk melakukan sesuatu 2.
untuk 1. - Longgar menunggu di C #:
Thread.Sleep(numberOfMilliseconds);
Namun, Windows Thread Scheduler menyebabkan akurasi Sleep()sekitar 15ms (jadi Sleep dapat dengan mudah menunggu hingga 20ms, bahkan jika dijadwalkan hanya menunggu 1ms).
untuk 2. - Ketat menunggu di C # adalah:
Stopwatch stopwatch =Stopwatch.StartNew();while(true){//some other processing to do possibleif(stopwatch.ElapsedMilliseconds>= millisecondsToWait){break;}}
Kita juga bisa menggunakan DateTime.Nowatau cara lain pengukuran waktu, tetapi Stopwatchjauh lebih cepat (dan ini akan benar-benar terlihat dalam loop ketat).
untuk 3. - Kombinasi:
Stopwatch stopwatch =Stopwatch.StartNew();while(true){//some other processing to do STILL POSSIBLEif(stopwatch.ElapsedMilliseconds>= millisecondsToWait){break;}Thread.Sleep(1);//so processor can rest for a while}
Kode ini secara teratur memblokir utas selama 1 ms (atau sedikit lebih, tergantung pada penjadwalan utas OS), sehingga prosesor tidak sibuk untuk waktu pemblokiran itu dan kode tidak menghabiskan 100% daya prosesor. Pemrosesan lainnya masih dapat dilakukan di antara pemblokiran (seperti: memperbarui UI, menangani acara atau melakukan hal-hal interaksi / komunikasi).
Anda tidak dapat menentukan waktu tidur yang pasti di Windows. Anda memerlukan OS waktu nyata untuk itu. Yang terbaik yang dapat Anda lakukan adalah menentukan waktu tidur minimum . Kemudian terserah penjadwal untuk membangunkan utas Anda setelah itu. Dan tidak pernah memanggil .Sleep()utas GUI.
Utas tidak akan dijadwalkan untuk dieksekusi oleh sistem operasi untuk jumlah waktu yang ditentukan. Metode ini mengubah status utas untuk menyertakan WaitSleepJoin.
Metode ini tidak melakukan pemompaan COM dan SendMessage standar. Jika Anda perlu tidur di utas yang memiliki STAThreadAttribute, tetapi Anda ingin melakukan pemompaan COM dan SendMessage standar, pertimbangkan untuk menggunakan salah satu kelebihan dari metode Bergabung yang menentukan interval waktu habis.
usingSystem.Runtime.InteropServices;[DllImport("winmm.dll",EntryPoint="timeBeginPeriod",SetLastError=true)]privatestaticexternuintTimeBeginPeriod(uint uMilliseconds);[DllImport("winmm.dll",EntryPoint="timeEndPeriod",SetLastError=true)]privatestaticexternuintTimeEndPeriod(uint uMilliseconds);/**
* Extremely accurate sleep is needed here to maintain performance so system resolution time is increased
*/privatevoid accurateSleep(int milliseconds){//Increase timer resolution from 20 miliseconds to 1 milisecondTimeBeginPeriod(1);Stopwatch stopwatch =newStopwatch();//Makes use of QueryPerformanceCounter WIN32 API
stopwatch.Start();while(stopwatch.ElapsedMilliseconds< milliseconds){//So we don't burn cpu cyclesif((milliseconds - stopwatch.ElapsedMilliseconds)>20){Thread.Sleep(5);}else{Thread.Sleep(1);}}
stopwatch.Stop();//Set it back to normal.TimeEndPeriod(1);}
Jawaban:
Ingat juga, bahwa melakukan ini di utas GUI utama akan memblokir GUI Anda dari pembaruan (akan terasa "lamban")
Hapus saja
;
untuk membuatnya bekerja untuk VB.net juga.sumber
Pada dasarnya ada 3 pilihan untuk menunggu (hampir) bahasa pemrograman:
untuk 1. - Longgar menunggu di C #:
Namun, Windows Thread Scheduler menyebabkan akurasi
Sleep()
sekitar 15ms (jadi Sleep dapat dengan mudah menunggu hingga 20ms, bahkan jika dijadwalkan hanya menunggu 1ms).untuk 2. - Ketat menunggu di C # adalah:
Kita juga bisa menggunakan
DateTime.Now
atau cara lain pengukuran waktu, tetapiStopwatch
jauh lebih cepat (dan ini akan benar-benar terlihat dalam loop ketat).untuk 3. - Kombinasi:
Kode ini secara teratur memblokir utas selama 1 ms (atau sedikit lebih, tergantung pada penjadwalan utas OS), sehingga prosesor tidak sibuk untuk waktu pemblokiran itu dan kode tidak menghabiskan 100% daya prosesor. Pemrosesan lainnya masih dapat dilakukan di antara pemblokiran (seperti: memperbarui UI, menangani acara atau melakukan hal-hal interaksi / komunikasi).
sumber
Anda tidak dapat menentukan waktu tidur yang pasti di Windows. Anda memerlukan OS waktu nyata untuk itu. Yang terbaik yang dapat Anda lakukan adalah menentukan waktu tidur minimum . Kemudian terserah penjadwal untuk membangunkan utas Anda setelah itu. Dan tidak pernah memanggil
.Sleep()
utas GUI.sumber
Karena sekarang Anda memiliki fitur async / menunggu, cara terbaik untuk tidur selama 50 ms adalah dengan menggunakan Task.Delay:
Atau jika Anda menargetkan .NET 4 (dengan Async CTP 3 untuk VS2010 atau Microsoft.Bcl.Async), Anda harus menggunakan:
Dengan cara ini Anda tidak akan memblokir utas UI.
sumber
FlushAsync
versi.async
deklarasi adalah meneleponTask.Delay(50).Wait();
Gunakan kode ini
sumber
Utas tidak akan dijadwalkan untuk dieksekusi oleh sistem operasi untuk jumlah waktu yang ditentukan. Metode ini mengubah status utas untuk menyertakan WaitSleepJoin.
Metode ini tidak melakukan pemompaan COM dan SendMessage standar. Jika Anda perlu tidur di utas yang memiliki STAThreadAttribute, tetapi Anda ingin melakukan pemompaan COM dan SendMessage standar, pertimbangkan untuk menggunakan salah satu kelebihan dari metode Bergabung yang menentukan interval waktu habis.
sumber
Untuk dibaca:
sumber
Dimulai dengan .NET Framework 4.5, Anda dapat menggunakan:
sumber
Terbaik dari kedua dunia:
sumber