আসুন এই খুব সহজ async পদ্ধতি বিবেচনা করুন:
static async Task myMethodAsync()
{
await Task.Delay(500);
}
আমি যখন ভিএস2013 (প্রাক রোজলিন সংকলক) দিয়ে এটি সংকলন করি তখন উত্পন্ন রাষ্ট্র-মেশিনটি একটি কাঠামো।
private struct <myMethodAsync>d__0 : IAsyncStateMachine
{
...
void IAsyncStateMachine.MoveNext()
{
...
}
}
আমি যখন এটি ভিএস2015 (রোজলিন) দিয়ে সংকলন করি তখন উত্পন্ন কোডটি হ'ল:
private sealed class <myMethodAsync>d__1 : IAsyncStateMachine
{
...
void IAsyncStateMachine.MoveNext()
{
...
}
}
আপনি দেখতে পাচ্ছেন রোজলিন একটি শ্রেণি উত্পন্ন করে (এবং কোনও কাঠামো নয়)। যদি আমি পুরানো সংকলক (সিটিপি ২০১২২ অনুমান করি) পুরানো সংকলক (সিটিপি ২০১২২ অনুমান) এর প্রথম অ্যাসিঙ্ক / অপেক্ষার সহায়তার প্রথম প্রয়োগগুলি সঠিকভাবে মনে রাখি এবং তারপরে পারফরম্যান্সের কারণে এটি কাঠামোতে পরিবর্তিত হয়। (দেখুন (কিছু কিছু ক্ষেত্রে আপনি সম্পূর্ণরূপে বক্সিং এবং গাদা বরাদ্দ ... এড়াতে পারেন) এই )
রোজলিনে আবার কেন এটি পরিবর্তন করা হয়েছিল তা কি কেউ জানেন? (এটি সম্পর্কে আমার কোনও সমস্যা নেই, আমি জানি যে এই পরিবর্তনটি স্বচ্ছ এবং কোনও কোডের আচরণ পরিবর্তন করে না, আমি কেবল কৌতূহলী)
সম্পাদনা করুন:
@ ডামিয়েন_ই_ অবিশ্বাসীর (এবং উত্স কোড :)) এর উত্তর ইমো সবকিছু ব্যাখ্যা করে। রোজলিনের বর্ণিত আচরণ কেবলমাত্র ডিবাগ বিল্ডের জন্য প্রযোজ্য (এবং মন্তব্যটিতে উল্লিখিত সিএলআর সীমাবদ্ধতার কারণে এটি প্রয়োজন)। রিলিজে এটি একটি কাঠামো তৈরি করে (এর সমস্ত সুবিধা সহ ..)। সুতরাং এটি সম্পাদনা এবং চালিয়ে যাওয়া এবং উত্পাদনে আরও ভাল পারফরম্যান্স উভয়কেই সমর্থন করার জন্য খুব চতুর সমাধান বলে মনে হচ্ছে। আকর্ষণীয় স্টাফ, অংশ নেওয়া প্রত্যেকের জন্য ধন্যবাদ!
asyncপদ্ধতির প্রায় সবসময়ই একটি সত্য অ্যাসিনক্রোনাস পয়েন্ট থাকে - এটিawaitএমন একটি নিয়ন্ত্রণ দেয় যা স্ট্রাক্টকে যাইহোক বক্স করা দরকার। আমি বিশ্বাস করি যে স্ট্রোকগুলিasyncসিঙ্ক্রোনালি চলমান যে পদ্ধতিগুলির জন্য কেবল মেমরির চাপকে মুক্তি দেয় ।