Çok geç olabilir, ancak yararlı bir araştırma olabilir:
Derlenmiş kodun ( IL ) iç yapısı hakkında :
public static async Task<int> GetTestData()
{
return 12;
}
IL'de olur:
.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
}
Ve eşzamansız ve görev yöntemi olmadan:
public static int GetTestData()
{
return 12;
}
şu hale gelir:
.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
}
Bu yöntemler arasındaki büyük farkı görebileceğiniz gibi. Await inside async yöntemini kullanmıyorsanız ve async yöntemini kullanmayı umursamıyorsanız (örneğin API çağrısı veya olay işleyicisi), iyi fikir onu normal eşitleme yöntemine dönüştürür (uygulama performansınızı korur).
Güncellenmiş:
Ayrıca microsoft docs https://docs.microsoft.com/en-us/dotnet/standard/async-in-depth adresinden ek bilgiler de mevcuttur :
zaman uyumsuz yöntemlerin vücutlarında bir await anahtar kelimesi olması gerekir, aksi takdirde asla sonuç vermezler! Bunu akılda tutmak önemlidir. Bir zaman uyumsuz yöntemin gövdesinde await kullanılmazsa, C # derleyicisi bir uyarı oluşturur, ancak kod, normal bir yöntemmiş gibi derlenir ve çalışır. Zaman uyumsuz yöntem için C # derleyicisi tarafından oluşturulan durum makinesi hiçbir şey başaramayacağından, bunun da inanılmaz derecede verimsiz olacağını unutmayın.
async
?