Bu çok basit eşzamansız yöntemi ele alalım:
static async Task myMethodAsync()
{
await Task.Delay(500);
}
Bunu VS2013 (Roslyn öncesi derleyici) ile derlediğimde, üretilen durum makinesi bir yapıdır.
private struct <myMethodAsync>d__0 : IAsyncStateMachine
{
...
void IAsyncStateMachine.MoveNext()
{
...
}
}
VS2015 (Roslyn) ile derlediğimde üretilen kod şudur:
private sealed class <myMethodAsync>d__1 : IAsyncStateMachine
{
...
void IAsyncStateMachine.MoveNext()
{
...
}
}
Gördüğünüz gibi Roslyn bir sınıf (yapı değil) üretir. Eğer doğru hatırlıyorsam, eski derleyicideki async / await desteğinin ilk uygulamaları (CTP2012 sanırım) da sınıflar oluşturdu ve daha sonra performans nedenlerinden yapı olarak değiştirildi. (Bkz (bazı durumlarda tamamen boks ve yığın ayırma ... önleyebilirsiniz) bu )
Roslyn'de bunun neden tekrar değiştirildiğini bilen var mı? (Bununla ilgili herhangi bir problemim yok, bu değişikliğin şeffaf olduğunu ve herhangi bir kodun davranışını değiştirmediğini biliyorum, sadece merak ediyorum)
Düzenle:
@Damien_The_Unbeliever'ın (ve kaynak kodu :)) cevabı imho her şeyi açıklıyor. Roslyn'in açıklanan davranışı yalnızca hata ayıklama derlemesi için geçerlidir (ve bu, açıklamada bahsedilen CLR sınırlaması nedeniyle gereklidir). Sürümde aynı zamanda bir yapı oluşturur (tüm faydalarıyla birlikte ..). Dolayısıyla bu, hem Düzenleme hem de Devam Etme ve üretimde daha iyi performansı desteklemek için çok akıllıca bir çözüm gibi görünüyor. İlginç şeyler, katılan herkese teşekkürler!
async
yöntemler hemen hemen her zaman gerçek bir eşzamansız noktaya sahiptir -await
bu, yapının yine de kutulanmasını gerektirecek bir denetim sağlar. Ben inanıyorum yapılar yalnızca bellek basıncı rahatlatmak istiyorumasync
eşzamanlı çalıştırmak oldu yöntemlerle.