이 매우 간단한 비동기 메서드를 고려해 봅시다.
static async Task myMethodAsync()
{
await Task.Delay(500);
}
VS2013 (Pre Roslyn 컴파일러)으로 이것을 컴파일하면 생성 된 상태 머신이 구조체입니다.
private struct <myMethodAsync>d__0 : IAsyncStateMachine
{
...
void IAsyncStateMachine.MoveNext()
{
...
}
}
VS2015 (Roslyn)로 컴파일 할 때 생성 된 코드는 다음과 같습니다.
private sealed class <myMethodAsync>d__1 : IAsyncStateMachine
{
...
void IAsyncStateMachine.MoveNext()
{
...
}
}
보시다시피 Roslyn은 클래스를 생성합니다 (구조체가 아님). 이전 컴파일러에서 비동기 / 대기 지원의 첫 번째 구현 (CTP2012 추측)도 클래스를 생성 한 다음 성능상의 이유로 struct로 변경되었습니다. (어떤 경우에는 권투와 힙 할당을 완전히 피할 수 있습니다…) ( 이것을보십시오 )
Roslyn에서 이것이 왜 다시 변경되었는지 아는 사람이 있습니까? (나는 이것에 대해 아무런 문제가 없습니다.이 변경이 투명하고 코드의 동작을 변경하지 않는다는 것을 알고 있습니다. 저는 궁금합니다)
편집하다:
@Damien_The_Unbeliever (및 소스 코드 :)의 대답 imho는 모든 것을 설명합니다. 설명 된 Roslyn 동작은 디버그 빌드에만 적용됩니다 (주석에 언급 된 CLR 제한 때문에 필요함). Release에서는 또한 구조체를 생성합니다 (모든 이점이 있습니다 ..). 따라서 이것은 편집과 계속을 모두 지원하고 프로덕션에서 더 나은 성능을 지원하는 매우 영리한 솔루션 인 것 같습니다. 참여 해주신 모든 분들께 감사드립니다!
async
메서드는 거의 항상 진정한 비동기 포인트를 가지고 있습니다.await
제어를 생성하는 struct는 어쨌든 boxing되어야합니다. 나는 생각 구조체는 메모리 압력 완화 할async
동 기적으로 실행하는 일이 방법을.