คุณได้รับข้อผิดพลาดนั้นเนื่องจากTask
ชั้นเรียนได้เริ่มงานก่อนที่จะมอบให้กับคุณ คุณควรเรียกStart
ใช้เฉพาะงานที่คุณสร้างขึ้นโดยเรียกตัวสร้างและคุณไม่ควรทำเช่นนั้นเว้นแต่คุณจะมีเหตุผลที่น่าสนใจที่จะไม่เริ่มงานเมื่อคุณสร้างขึ้น ถ้าคุณต้องการที่จะเริ่มต้นทันทีที่คุณควรใช้Task.Run
หรือทั้งจำทั้งสร้างและเริ่มต้นใหม่Task.Factory.StartNew
Task
Start
ดังนั้นตอนนี้เรารู้ว่าเพียงกำจัดน่าชังว่า คุณจะเรียกใช้รหัสของคุณและพบว่ากล่องข้อความนั้นปรากฏขึ้นทันทีไม่ใช่ 5 วินาทีต่อมาเกิดอะไรขึ้น?
ดีTask.Delay
เพียงแค่ช่วยให้คุณมีงานที่จะแล้วเสร็จใน 5 วินาที ไม่หยุดการทำงานของเธรดเป็นเวลา 5 วินาที สิ่งที่คุณต้องการทำคือมีโค้ดบางอย่างที่เรียกใช้งานหลังจากงานนั้นเสร็จสิ้น นั่นคือสิ่งที่ContinueWith
มีไว้สำหรับ ช่วยให้คุณสามารถรันโค้ดหลังจากทำงานที่กำหนดเสร็จแล้ว:
public void FunctionA()
{
Task.Delay(5000)
.ContinueWith(t =>
{
MessageBox.Show("Waiting Complete");
});
}
สิ่งนี้จะทำงานตามที่คาดไว้
นอกจากนี้เรายังสามารถใช้ประโยชน์จากawait
คำหลักของ C # 5.0 เพื่อเพิ่มความต่อเนื่องได้ง่ายขึ้น:
public async Task FunctionA()
{
await Task.Delay(5000);
MessageBox.Show("Waiting Complete");
}
ในขณะที่คำอธิบายทั้งหมดของสิ่งที่เกิดขึ้นที่นี่อยู่นอกเหนือขอบเขตของคำถามนี้ แต่ผลลัพธ์ที่ได้คือวิธีการที่คล้ายกับวิธีการก่อนหน้านี้มาก มันจะแสดงกล่องข้อความ 5 วินาทีหลังจากที่คุณเรียกใช้เมธอด แต่เมธอดนั้นจะกลับมา [เกือบ] ทันทีในทั้งสองกรณี กล่าวได้ว่าawait
มีประสิทธิภาพมากและช่วยให้เราสามารถเขียนวิธีการที่ดูเหมือนง่ายและตรงไปตรงมา แต่จะยากกว่ามากและยากกว่าที่จะเขียนโดยใช้ContinueWith
โดยตรง นอกจากนี้ยังช่วยลดความยุ่งยากในการจัดการกับข้อผิดพลาดอย่างมากโดยนำโค้ดสำเร็จรูปจำนวนมากออกไป
Wait()
ใช้งานจะบล็อกเธรดปัจจุบันจนกว่างานจะได้รับการแก้ไข นั่นแทบจะไม่ใช่สิ่งที่คุณต้องการให้เกิดขึ้น