এটি অনেক দেরিতে হতে পারে তবে এটি কার্যকর তদন্ত হতে পারে:
সংকলিত কোড ( আইএল ) এর অভ্যন্তরীণ কাঠামো সম্পর্কে রয়েছে :
public static async Task<int> GetTestData()
{
return 12;
}
এটি আইএল-তে পরিণত হয়:
.method private hidebysig static class [mscorlib]System.Threading.Tasks.Task`1<int32>
GetTestData() cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.AsyncStateMachineAttribute::.ctor(class [mscorlib]System.Type) = ( 01 00 28 55 73 61 67 65 4C 69 62 72 61 72 79 2E
53 74 61 72 74 54 79 70 65 2B 3C 47 65 74 54 65
73 74 44 61 74 61 3E 64 5F 5F 31 00 00 )
.custom instance void [mscorlib]System.Diagnostics.DebuggerStepThroughAttribute::.ctor() = ( 01 00 00 00 )
.maxstack 2
.locals init ([0] class UsageLibrary.StartType/'<GetTestData>d__1' V_0,
[1] valuetype [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1<int32> V_1)
IL_0000: newobj instance void UsageLibrary.StartType/'<GetTestData>d__1'::.ctor()
IL_0005: stloc.0
IL_0006: ldloc.0
IL_0007: call valuetype [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1<!0> valuetype [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1<int32>::Create()
IL_000c: stfld valuetype [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1<int32> UsageLibrary.StartType/'<GetTestData>d__1'::'<>t__builder'
IL_0011: ldloc.0
IL_0012: ldc.i4.m1
IL_0013: stfld int32 UsageLibrary.StartType/'<GetTestData>d__1'::'<>1__state'
IL_0018: ldloc.0
IL_0019: ldfld valuetype [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1<int32> UsageLibrary.StartType/'<GetTestData>d__1'::'<>t__builder'
IL_001e: stloc.1
IL_001f: ldloca.s V_1
IL_0021: ldloca.s V_0
IL_0023: call instance void valuetype [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1<int32>::Start<class UsageLibrary.StartType/'<GetTestData>d__1'>(!!0&)
IL_0028: ldloc.0
IL_0029: ldflda valuetype [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1<int32> UsageLibrary.StartType/'<GetTestData>d__1'::'<>t__builder'
IL_002e: call instance class [mscorlib]System.Threading.Tasks.Task`1<!0> valuetype [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1<int32>::get_Task()
IL_0033: ret
}
এবং অ্যাসিঙ্ক এবং কার্য পদ্ধতি ছাড়াই:
public static int GetTestData()
{
return 12;
}
হয়ে:
.method private hidebysig static int32 GetTestData() cil managed
{
.maxstack 1
.locals init ([0] int32 V_0)
IL_0000: nop
IL_0001: ldc.i4.s 12
IL_0003: stloc.0
IL_0004: br.s IL_0006
IL_0006: ldloc.0
IL_0007: ret
}
আপনি এই পদ্ধতির মধ্যে বড় পার্থক্য দেখতে পাচ্ছিলেন। আপনি যদি অ্যাসিঙ্ক পদ্ধতির অভ্যর্থনা না ব্যবহার করেন এবং অ্যাসিঙ্ক পদ্ধতিটি ব্যবহারের বিষয়ে চিন্তা না করেন (উদাহরণস্বরূপ এপিআই কল বা ইভেন্ট হ্যান্ডলার) ভাল ধারণা এটিকে সাধারণ সিঙ্ক পদ্ধতিতে রূপান্তর করবে (এটি আপনার অ্যাপ্লিকেশন কার্যকারিতা সংরক্ষণ করে)।
আপডেট হয়েছে:
মাইক্রোসফ্ট ডক্স https://docs.microsoft.com/en-us/dotnet/standard/async-in-dthth থেকে অতিরিক্ত তথ্যও রয়েছে :
অ্যাসিঙ্ক পদ্ধতিতে তাদের শরীরে একটি প্রতীক্ষিত কীওয়ার্ড থাকা দরকার বা তারা কখনই ফল পাবে না! এটা মনে রাখা গুরুত্বপূর্ণ। যদি অ্যাসিঙ্ক পদ্ধতির শরীরে অপেক্ষা না করা হয় তবে সি # সংকলক একটি সতর্কতা উত্পন্ন করবে তবে কোডটি সংকলন করে চালানো হবে যেন এটি একটি সাধারণ পদ্ধতি। নোট করুন যে এটি অবিশ্বাস্যরূপে অকার্যকরও হবে, কেননা অ্যাসিঙ্ক পদ্ধতির জন্য সি # সংকলক দ্বারা উত্পাদিত রাষ্ট্রীয় মেশিন কোনও কিছুই সম্পাদন করে না।
async
?