Mari pertimbangkan metode asinkron yang sangat sederhana ini:
static async Task myMethodAsync()
{
await Task.Delay(500);
}
Ketika saya mengkompilasi ini dengan VS2013 (sebelum kompiler Roslyn) mesin negara yang dihasilkan adalah sebuah struct.
private struct <myMethodAsync>d__0 : IAsyncStateMachine
{
...
void IAsyncStateMachine.MoveNext()
{
...
}
}
Ketika saya mengkompilasinya dengan VS2015 (Roslyn) kode yang dihasilkan adalah ini:
private sealed class <myMethodAsync>d__1 : IAsyncStateMachine
{
...
void IAsyncStateMachine.MoveNext()
{
...
}
}
Seperti yang Anda lihat, Roslyn menghasilkan kelas (dan bukan struct). Jika saya ingat dengan benar implementasi pertama async / await dukungan di kompiler lama (CTP2012 kurasa) juga menghasilkan kelas dan kemudian diubah menjadi struct dari alasan kinerja. (dalam beberapa kasus, Anda dapat sepenuhnya menghindari tinju dan alokasi heap…) (Lihat ini )
Adakah yang tahu mengapa ini diubah lagi di Roslyn? (Saya tidak punya masalah tentang ini, saya tahu bahwa perubahan ini transparan dan tidak mengubah perilaku kode apa pun, saya hanya ingin tahu)
Edit:
Jawaban dari @Damien_The_Unbeliever (dan source code :)) imho menjelaskan semuanya. Perilaku yang dijelaskan dari Roslyn hanya berlaku untuk debug build (dan itu diperlukan karena batasan CLR yang disebutkan dalam komentar). Dalam Rilis itu juga menghasilkan struct (dengan semua manfaat itu ..). Jadi ini tampaknya menjadi solusi yang sangat cerdas untuk mendukung Edit dan Continue serta kinerja yang lebih baik dalam produksi. Hal-hal menarik, terima kasih untuk semua yang telah berpartisipasi!
async
metode hampir selalu memiliki titik asynchronous yang sebenarnya -await
yang menghasilkan kontrol, yang akan membutuhkan struct untuk dimasukkan ke dalam kotak. Saya percaya struct hanya akan mengurangi tekanan memori untukasync
metode yang berjalan secara sinkron.