ฉันรู้ว่าโดยทั่วไปถือว่าเป็นความคิดที่ไม่ดีที่จะใช้วิธีการจุดไฟและลืมasync void
เพื่อเริ่มงานเนื่องจากไม่มีงานที่รอดำเนินการอยู่และเป็นเรื่องยากที่จะจัดการข้อยกเว้นที่อาจเกิดขึ้นในวิธีการดังกล่าว
โดยทั่วไปฉันควรหลีกเลี่ยงasync void
ตัวจัดการเหตุการณ์ด้วยหรือไม่ ตัวอย่างเช่น,
private async void Form_Load(object sender, System.EventArgs e)
{
await Task.Delay(2000); // do async work
// ...
}
ฉันสามารถเขียนใหม่ได้ดังนี้:
Task onFormLoadTask = null; // track the task, can implement cancellation
private void Form_Load(object sender, System.EventArgs e)
{
this.onFormLoadTask = OnFormLoadTaskAsync(sender, e);
}
private async Task OnFormLoadTaskAsync(object sender, System.EventArgs e)
{
await Task.Delay(2000); // do async work
// ...
}
หินใต้น้ำสำหรับตัวจัดการเหตุการณ์ async มีอะไรบ้างนอกเหนือจาก re-entrancy ที่เป็นไปได้?