आइए इस बहुत ही सरल एस्कॉन विधि पर विचार करें:
static async Task myMethodAsync()
{
await Task.Delay(500);
}
जब मैं इसे VS2013 (पूर्व रोसलिन कंपाइलर) के साथ संकलित करता हूं तो उत्पन्न स्थिति-मशीन एक संरचना है।
private struct <myMethodAsync>d__0 : IAsyncStateMachine
{
...
void IAsyncStateMachine.MoveNext()
{
...
}
}
जब मैं इसे VS2015 (रोसलिन) के साथ संकलित करता हूं तो उत्पन्न कोड यह है:
private sealed class <myMethodAsync>d__1 : IAsyncStateMachine
{
...
void IAsyncStateMachine.MoveNext()
{
...
}
}
जैसा कि आप देख सकते हैं कि रोजलिन एक वर्ग उत्पन्न करता है (और एक संरचना नहीं)। यदि मुझे सही ढंग से याद है कि पुराने कंपाइलर (CTP2012 मुझे लगता है) में async / प्रतीक्षा समर्थन का पहला कार्यान्वयन भी कक्षाएं उत्पन्न करता है और फिर इसे प्रदर्शन कारणों से संरचना में बदल दिया गया। (देखें (कुछ मामलों में आप पूरी तरह से बॉक्सिंग और ढेर आवंटन ... से बच सकते हैं) इस )
क्या किसी को पता है कि रोजलिन में इसे फिर से क्यों बदला गया? (मुझे इससे संबंधित कोई समस्या नहीं है, मुझे पता है कि यह परिवर्तन पारदर्शी है और किसी भी कोड के व्यवहार को नहीं बदलता है, मैं सिर्फ उत्सुक हूं)
संपादित करें:
@Damien_The_Unbeliever (और स्रोत कोड :)) से जवाब imho सब कुछ बताते हैं। रोसलिन का वर्णित व्यवहार केवल डिबग बिल्ड के लिए लागू होता है (और टिप्पणी में उल्लिखित CLR सीमा के कारण इसकी आवश्यकता है)। रिलीज में यह एक संरचना भी उत्पन्न करता है (उस के सभी लाभों के साथ ..)। तो यह एडिट एंड कंटेंट और उत्पादन में बेहतर प्रदर्शन दोनों का समर्थन करने के लिए एक बहुत ही चतुर समाधान प्रतीत होता है। दिलचस्प सामान, भाग लेने वाले सभी लोगों के लिए धन्यवाद!
async
विधियों में लगभग हमेशा एक वास्तविक एसिंक्रोनस बिंदु होता है - जोawait
कि पैदावार को नियंत्रित करता है, जिसके लिए संरचना को वैसे भी बॉक्स करना होगा। मेरा मानना है कि संरचनाएं केवल उन यादों के दबावों को दूर करेंगीasync
जो तुल्यकालिक रूप से चलने के लिए हुई थीं।