วิธีเพิ่มการหน่วงเวลา 2 หรือ 3 วินาที [ปิด]


129

ฉันจะเพิ่มความล่าช้าให้กับโปรแกรมใน C # ได้อย่างไร


2
มีหลายวิธีในการดำเนินการนี้ แต่ทำไมคุณต้องเพิ่มความล่าช้า ถ้าเรารู้แล้วเราจะสามารถแนะนำวิธีที่เหมาะสมที่สุดได้
ChrisF

3
คำถามนี้ไม่มีเอกสารที่จะแนะนำ Thread.Sleep ()
Hans Passant

1
เพื่อความกระจ่างฉันโหวตให้ปิดคำถามนี้เนื่องจากคุณไม่ได้ให้รายละเอียดเพียงพอสำหรับใครที่จะให้คำตอบที่ดีและมีคุณภาพ ฉันยินดีเป็นอย่างยิ่งที่จะเปิดใหม่เป็นคำถามที่ถูกต้องหากคุณเพิ่มรายละเอียดเพิ่มเติมเกี่ยวกับสิ่งที่คุณกำลังพยายามทำ การปิดการลงคะแนนก่อนกำหนดเป็นวิธีหนึ่งในการป้องกัน "เสียง" ที่จะตอบคำถามคุณภาพต่ำ เมื่อคุณเพิ่มรายละเอียดเพิ่มเติมแล้วให้แสดงความคิดเห็นและ / หรือตั้งค่าสถานะตัวดัดแปลงเพื่อเปิดใหม่
โคดี้เกรย์

14
การตัดสินใจที่ไม่ดีในการปิดคำถามนี้ เป็นคำถามและเป็นเรื่องปกติธรรมดา ฉันเข้าใจมันอย่างถ่องแท้
user2430797

5
ยังมีอีกคำถามที่ฉันกำลังค้นหาตอบโดยคำถามที่ถูกปิดโดยไม่มีเหตุผล
Glenn Maynard

คำตอบ:


177

คุณสามารถใช้Thread.Sleep()ฟังก์ชันเช่น

int milliseconds = 2000;
Thread.Sleep(milliseconds);

ที่หยุดการทำงานของเธรดปัจจุบันโดยสมบูรณ์เป็นเวลา 2 วินาที

อาจเป็นสถานการณ์ที่เหมาะสมที่สุดThread.Sleepคือเมื่อคุณต้องการชะลอการดำเนินการในเธรดอื่นซึ่งแตกต่างจากหลักเช่น:

 MAIN THREAD        --------------------------------------------------------->
 (UI, CONSOLE ETC.)      |                                      |
                         |                                      |
 OTHER THREAD            ----- ADD A DELAY (Thread.Sleep) ------>

สำหรับสถานการณ์อื่น ๆ (เช่นการดำเนินงานเริ่มต้นหลังจากที่บางเวลา ฯลฯ ) ตรวจสอบคำตอบของโคดี้


13
หลีกเลี่ยงการใช้ Thead สาเหตุการนอนหลับมันจะบล็อกเธรดปัจจุบันอย่างสมบูรณ์ไม่ให้ทำสิ่งใด ๆ จนกว่าระยะเวลาจะสิ้นสุด
Mohammed Swillam

7
@ โมฮัมเหม็ด: ใช่แน่นอนว่ามันจะปิดกั้นดอกยางอย่างสมบูรณ์ แต่บางครั้งมันก็มีประโยชน์ ... มันขึ้นอยู่กับสิ่งที่ OP ต้องการจริงๆ ...
digEmAll

12
ตั้งแต่ฉันไม่สามารถโพสต์คำตอบใหม่ผมอยากจะแสดงความคิดเห็น - await Task.Delay(milliseconds)หากคุณไม่ต้องการมันเพื่อป้องกันโปรแกรมที่คุณสามารถใช้ สิ่งนี้ได้ผลสำหรับฉัน :)
SaiyanGirl

ในกรณีของฉันฉันไม่สามารถใช้ await ได้เพราะฉันถูกเรียกจากส่วนหนึ่งของโปรแกรมที่เขียนโดยคนอื่น เป็นสิ่งที่รอไม่ได้ แต่ถ้าฉัน "แฮงค์" ฉันสามารถทำงานได้เป็นเวลา 10 วินาทีก่อนที่สิ่งของของฉันจะปิดลง การนอน 2 วินาทีทำงานได้อย่างมีเสน่ห์;) ในบางกรณีก็เป็นเช่นนั้น
ฯลฯ

@MohammedElSayed: คำตอบขึ้นอยู่กับ ทั้งหมดขึ้นอยู่กับความตั้งใจในการใช้งาน สำหรับกรณีของฉันฉันต้องนอนเธรดเป็นเวลา 0.6 วินาทีอย่างแม่นยำเพื่อหลีกเลี่ยงการ จำกัด ดัชนีเมื่อแทรกลงในฐานข้อมูล
GunWanderer

61

ใช้ตัวจับเวลาโดยกำหนดช่วงเวลาไว้ที่ 2–3 วินาที

คุณมีตัวเลือกที่แตกต่างกันสามแบบให้เลือกขึ้นอยู่กับประเภทของแอปพลิเคชันที่คุณกำลังเขียน:

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

อย่าใช้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 แบบแช่แข็งดังนั้นคุณต้องคิดว่าจะเกิดอะไรขึ้นหากคุณเริ่มความล่าช้าหลายครั้ง (เช่นหากเกิดจากการคลิกปุ่ม) - พิจารณาปิดใช้งานปุ่มดังกล่าวหรือยกเลิกตัวจับเวลา / งานหรือตรวจสอบให้แน่ใจว่าล่าช้า การดำเนินการสามารถทำได้หลายครั้งอย่างปลอดภัย


5
หากเป็นแอปพลิเคชันคอนโซลThread.Sleepคำเตือนอาจไม่สำคัญเท่า
Merlyn Morgan-Graham

1
มีตัวจับเวลาที่ 4: System.Web.UI.Timerซึ่งเป็นคอมโพเนนต์ ASP.NET ที่ดำเนินการโพสต์แบ็คหน้าเว็บแบบอะซิงโครนัสหรือซิงโครนัสในช่วงเวลาปกติ
เดวิด

1
ควรเป็นคำตอบอันดับต้น ๆ หากมีตัวอย่างในการใช้ตัวจับเวลาตัวใดตัวหนึ่งก็จะได้รับคะแนนโหวตมากขึ้น ...
Mercutio

Cody Grey คุณสามารถเพิ่มawait Task.Delay()เวอร์ชันและความคิดเห็นแบบอินไลน์ได้หรือไม่ว่าแอปคอนโซลน่าจะต้องการใช้Sleep(ไม่ใช่แบบ async Main) หรือDelay(async Main)
Alexei Levenkov

1
@CodyGray เสร็จแล้ว.
Alexei Levenkov


6
System.Threading.Thread.Sleep(
    (int)System.TimeSpan.FromSeconds(3).TotalMilliseconds);

หรือด้วยusingงบ:

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

ฉันชอบสิ่งนี้มากกว่า1000 * numSeconds(หรือง่าย ๆ3000) เพราะมันทำให้ชัดเจนมากขึ้นว่าเกิดอะไรขึ้นกับคนที่ไม่เคยใช้มาThread.Sleepก่อน เอกสารเจตนาของคุณจะดีกว่า


2
+1 สำหรับ TimeSpan มากกว่า 1,000 *
Lefty

ด้วย. NET 4 เป็นต้นไปคุณสามารถใช้งานThread.Sleep(TimeSpan)ได้โดยตรงโดยไม่ต้องแคสต์เป็น int
Holf
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.