Vamos considerar este método assíncrono muito simples:
static async Task myMethodAsync()
{
await Task.Delay(500);
}
Quando eu compilo isso com VS2013 (pré-compilador Roslyn), a máquina de estados gerada é uma estrutura.
private struct <myMethodAsync>d__0 : IAsyncStateMachine
{
...
void IAsyncStateMachine.MoveNext()
{
...
}
}
Quando eu compilo com VS2015 (Roslyn) o código gerado é este:
private sealed class <myMethodAsync>d__1 : IAsyncStateMachine
{
...
void IAsyncStateMachine.MoveNext()
{
...
}
}
Como você pode ver, Roslyn gera uma classe (e não uma estrutura). Se bem me lembro, as primeiras implementações do suporte async / await no compilador antigo (CTP2012 eu acho) também geraram classes e, em seguida, ele foi alterado para struct por motivos de desempenho. (em alguns casos, você pode evitar completamente o boxing e a alocação de heap ...) (Veja isto )
Alguém sabe por que isso mudou novamente em Roslyn? (Não tenho nenhum problema quanto a isso, sei que essa mudança é transparente e não altera o comportamento de nenhum código, só estou curioso)
Editar:
A resposta de @Damien_The_Unbeliever (e o código-fonte :)) imho explica tudo. O comportamento descrito do Roslyn se aplica apenas à compilação de depuração (e isso é necessário devido à limitação do CLR mencionada no comentário). No Release também gera uma estrutura (com todos os benefícios disso ..). Portanto, esta parece ser uma solução muito inteligente para oferecer suporte a Editar e Continuar e melhor desempenho na produção. Coisa interessante, obrigado a todos que participaram!
async
os métodos quase sempre têm um verdadeiro ponto assíncrono - umawait
que produz controle, o que exigiria que a estrutura fosse encaixotada de qualquer maneira. Eu acredito estruturas só iria aliviar a pressão de memória paraasync
métodos que aconteceram para ser executado de forma síncrona.