ฉันจะเพิ่มความล่าช้าให้กับโปรแกรมใน C # ได้อย่างไร
ฉันจะเพิ่มความล่าช้าให้กับโปรแกรมใน C # ได้อย่างไร
คำตอบ:
คุณสามารถใช้Thread.Sleep()ฟังก์ชันเช่น
int milliseconds = 2000;
Thread.Sleep(milliseconds);
ที่หยุดการทำงานของเธรดปัจจุบันโดยสมบูรณ์เป็นเวลา 2 วินาที
อาจเป็นสถานการณ์ที่เหมาะสมที่สุดThread.Sleepคือเมื่อคุณต้องการชะลอการดำเนินการในเธรดอื่นซึ่งแตกต่างจากหลักเช่น:
MAIN THREAD --------------------------------------------------------->
(UI, CONSOLE ETC.) | |
| |
OTHER THREAD ----- ADD A DELAY (Thread.Sleep) ------>
สำหรับสถานการณ์อื่น ๆ (เช่นการดำเนินงานเริ่มต้นหลังจากที่บางเวลา ฯลฯ ) ตรวจสอบคำตอบของโคดี้
await Task.Delay(milliseconds)หากคุณไม่ต้องการมันเพื่อป้องกันโปรแกรมที่คุณสามารถใช้ สิ่งนี้ได้ผลสำหรับฉัน :)
ใช้ตัวจับเวลาโดยกำหนดช่วงเวลาไว้ที่ 2–3 วินาที
คุณมีตัวเลือกที่แตกต่างกันสามแบบให้เลือกขึ้นอยู่กับประเภทของแอปพลิเคชันที่คุณกำลังเขียน:
อย่าใช้Thread.Sleepหากแอปพลิเคชันของคุณจำเป็นต้องประมวลผลอินพุตใด ๆ บนเธรดนั้นในเวลาเดียวกัน (WinForms, WPF) เนื่องจากSleepจะล็อกเธรดอย่างสมบูรณ์และป้องกันไม่ให้ประมวลผลข้อความอื่น ๆ สมมติว่าแอปพลิเคชันแบบเธรดเดียว (ส่วนใหญ่เป็น) แอปพลิเคชันทั้งหมดของคุณจะหยุดตอบสนองแทนที่จะชะลอการดำเนินการตามที่คุณต้องการ โปรดทราบว่าการใช้แอปพลิเคชัน Sleep in pure Console อาจเป็นเรื่องปกติเนื่องจากไม่มี "เหตุการณ์" ให้จัดการหรือแยกเธรด ( Task.Delayเป็นตัวเลือกที่ดีกว่า)
นอกจากตัวจับเวลาและSleepคุณสามารถใช้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.
}
await Task.Delay(2000)สามารถใช้Mainวิธีเดียวกันนี้ในวิธีการของแอปพลิเคชันคอนโซลหากคุณใช้ C # 7.1 ( Async main บนบล็อก MSDN )
หมายเหตุ: การดำเนินการล่าช้ากับSleepมีประโยชน์ในการหลีกเลี่ยงสภาพการแข่งขันที่มาจากการเริ่มต้นที่อาจเกิดขึ้นกับการดำเนินงานหลายตัวนับDelay/ น่าเสียดายที่ไม่ยอมรับแอปพลิเคชันที่ใช้ UI แบบแช่แข็งดังนั้นคุณต้องคิดว่าจะเกิดอะไรขึ้นหากคุณเริ่มความล่าช้าหลายครั้ง (เช่นหากเกิดจากการคลิกปุ่ม) - พิจารณาปิดใช้งานปุ่มดังกล่าวหรือยกเลิกตัวจับเวลา / งานหรือตรวจสอบให้แน่ใจว่าล่าช้า การดำเนินการสามารถทำได้หลายครั้งอย่างปลอดภัย
Thread.Sleepคำเตือนอาจไม่สำคัญเท่า
await Task.Delay()เวอร์ชันและความคิดเห็นแบบอินไลน์ได้หรือไม่ว่าแอปคอนโซลน่าจะต้องการใช้Sleep(ไม่ใช่แบบ async Main) หรือDelay(async Main)
2.3 วินาทีคุณควรทำ:
System.Threading.Thread.Sleep(2300);
System.Threading.Thread.Sleep(
(int)System.TimeSpan.FromSeconds(3).TotalMilliseconds);
หรือด้วยusingงบ:
Thread.Sleep((int)TimeSpan.FromSeconds(2).TotalMilliseconds);
ฉันชอบสิ่งนี้มากกว่า1000 * numSeconds(หรือง่าย ๆ3000) เพราะมันทำให้ชัดเจนมากขึ้นว่าเกิดอะไรขึ้นกับคนที่ไม่เคยใช้มาThread.Sleepก่อน เอกสารเจตนาของคุณจะดีกว่า
Thread.Sleep(TimeSpan)ได้โดยตรงโดยไม่ต้องแคสต์เป็น int