วิธีการรับ Thread.Sleep รอ?


139

ฉันกำลังเขียนแอปพลิเคชันที่เชื่อมโยงเครือข่ายโดยยึดตามกระบวนทัศน์ที่รอคอย / การนอนหลับ

บางครั้งเกิดข้อผิดพลาดในการเชื่อมต่อและจากประสบการณ์ของฉันมันจ่ายเพื่อรอเวลาแล้วลองอีกครั้ง

ปัญหาคือว่าถ้าฉันใช้ Thread.Sleep หรือการดำเนินการปิดกั้นที่คล้ายกันอื่นในการรอคอย / async จะบล็อกกิจกรรมทั้งหมดในเธรดผู้โทร

สิ่งที่ฉันควรแทนที่ Thread.Sleep (10,000) ด้วยเพื่อให้ได้ผลเช่นเดียวกับ

await Thread.SleepAsync(10000)

?

UPDATE

ฉันต้องการคำตอบที่ทำได้โดยไม่ต้องสร้างกระทู้เพิ่มเติม

คำตอบ:


323

คำตอบอื่น ๆ ที่แนะนำให้เริ่มหัวข้อใหม่เป็นความคิดที่ไม่ดีไม่จำเป็นต้องทำเช่นนั้น ส่วนหนึ่งของจุดasync/ awaitคือการลดจำนวนเธรดที่แอปพลิเคชันของคุณต้องการ

คุณควรใช้Task.Delayซึ่งไม่ต้องการเธรดใหม่และได้รับการออกแบบมาเพื่อวัตถุประสงค์นี้โดยเฉพาะ:

// Execution of the async method will continue one second later, but without
// blocking.
await Task.Delay(1000);

ฉันยังคงจับกับสิ่ง a4.5 สาขาของการดำเนินการกับรหัสหลังจากคำสั่งนั้นอยู่ที่ไหน ส่วนที่ไม่ได้นอนหลับ / ปิดกั้นไม่ทำงานหรือ 'เธรด' ที่รออยู่หรือไม่ การดำเนินการที่ไม่บล็อกหลักเพียงแค่ปล่อยให้บล็อกดังต่อไปนี้ (หรือที่รู้จักว่ากลับมา) หรือไม่?
เคนนี

1
ใช่. นี่คือสิ่งที่ฉันต้องการแน่นอน
Arsen Zahray

1
@ เคนนี่: คุณอาจพบว่าasyncบทนำของฉันมีประโยชน์ เมื่อ awaitable กลับโดยTask.Delayเป็นawaited เนื่องจากมันไม่สมบูรณ์วิธีการปัจจุบันผลตอบแทนที่เป็นงานที่ไม่สมบูรณ์ หลังจากนั้นเมื่อDelayเสร็จสมบูรณ์ (ปิดตัวจับเวลาไม่ใช่เธรด) ส่วนที่เหลือของวิธีการจะถูกกำหนดให้เรียกใช้ ความต่อเนื่องจะทำงานใน "บริบท" ซึ่งอาจกลับไปที่เธรดเดิม - รายละเอียดในบล็อกของฉัน
Stephen Cleary

@StephenCleary ขอบคุณสำหรับสิ่งนั้น ดังนั้นฉันถูกต้องในการบอกว่ารหัสหลังจากรอคอยคือ 'กำหนดเวลา' สำหรับการดำเนินการและการเรียกเธรดส่งคืน?
เคนนี

2
ใช่การเรียกเธรดจะส่งคืน (ทันที) และรหัสหลังจากawaitกำหนดเวลาไว้ (ในที่สุด)
Stephen Cleary
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.