ลองพิจารณาวิธีการ async ที่ง่ายมากนี้:
static async Task myMethodAsync()
{
await Task.Delay(500);
}
เมื่อฉันรวบรวมสิ่งนี้ด้วย VS2013 (คอมไพเลอร์ก่อน Roslyn) สถานะเครื่องที่สร้างขึ้นจะเป็นโครงสร้าง
private struct <myMethodAsync>d__0 : IAsyncStateMachine
{
...
void IAsyncStateMachine.MoveNext()
{
...
}
}
เมื่อฉันรวบรวมด้วย VS2015 (Roslyn) รหัสที่สร้างขึ้นคือ:
private sealed class <myMethodAsync>d__1 : IAsyncStateMachine
{
...
void IAsyncStateMachine.MoveNext()
{
...
}
}
อย่างที่คุณเห็น Roslyn สร้างคลาส (ไม่ใช่โครงสร้าง) ถ้าฉันจำได้อย่างถูกต้องการใช้งานครั้งแรกของการสนับสนุน async / await ในคอมไพเลอร์เก่า (ฉันเดาว่า CTP2012) ก็สร้างคลาสด้วยจากนั้นจึงเปลี่ยนเป็นโครงสร้างจากเหตุผลด้านประสิทธิภาพ (ในบางกรณีคุณสมบูรณ์สามารถหลีกเลี่ยงมวยและการจัดสรรกอง ... ) (ดูที่นี้ )
ไม่มีใครรู้ว่าทำไมถึงเปลี่ยนอีกครั้งใน Roslyn? (ฉันไม่มีปัญหาเกี่ยวกับเรื่องนี้ฉันรู้ว่าการเปลี่ยนแปลงนี้โปร่งใสและไม่ได้เปลี่ยนพฤติกรรมของโค้ดใด ๆ ฉันแค่อยากรู้)
แก้ไข:
คำตอบจาก @Damien_The_Unbeliever (และซอร์สโค้ด :)) imho อธิบายทุกอย่าง ลักษณะการทำงานที่อธิบายไว้ของ Roslyn ใช้สำหรับการสร้างดีบักเท่านั้น (และจำเป็นต้องใช้เนื่องจากข้อ จำกัด CLR ที่กล่าวถึงในความคิดเห็น) ใน Release ยังสร้างโครงสร้าง (พร้อมประโยชน์ทั้งหมดของสิ่งนั้น .. ) ดังนั้นนี่จึงเป็นโซลูชันที่ชาญฉลาดมากในการรองรับทั้ง Edit และ Continue และประสิทธิภาพที่ดีขึ้นในการผลิต สิ่งที่น่าสนใจขอบคุณสำหรับทุกคนที่เข้าร่วม!
async
เมธอดมักจะมีจุดอะซิงโครนัสที่แท้จริง -await
ซึ่งให้ผลการควบคุมซึ่งจะต้องมีการวางโครงสร้างไว้ ฉันเชื่อว่าโครงสร้างจะช่วยลดความกดดันของหน่วยความจำสำหรับasync
วิธีการที่เกิดขึ้นเพื่อทำงานพร้อมกันเท่านั้น