ฉันจะเพิ่มความล่าช้าให้กับโปรแกรมใน 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