2017-10-31 1 views
3

의 비동기 메서드가 올바른 것입니까?비동기 메서드 내에서 <code>await</code> 연산자가없는 "분기"를 갖는 것이 정확합니까?

public async Task<Person> GetName(string name) 
    { 
     if (string.IsNullOrWhiteSpace(name)) 
     { 
      return null; 
     } 
     return await _database.Logins.FirstOrDefaultAsync(i => i.Name.Contains(name)); 
    } 

Asynchronous programming

비동기 방법은 자신의 신체에 await를 키워드가 필요하거나 양보하지 않습니다 말한다!

비동기 메서드의 본문에 await가 사용되지 않으면 C# 컴파일러에서 경고를 생성하지만 정상적인 방법이면 코드가 컴파일되어 으로 실행됩니다. 이것은 또한이 아닌

감사합니다 모든 지점에서, 그것은 await 들어 있으므로 매우 비효율적

이 내 방식에 적용됩니까 될 것이라고합니다!

답변

3

async 장식 된 메서드가있는 경우 컴파일러는 nullTask.FromResult<Person>(null)으로 변환합니다.

메서드에 await이 있으면 컴파일러는 실제로 모든 await 연속을 추적하는 상태 시스템 인 클래스를 생성하므로 사용자가 기다리는 각 작업 완료 후 의도 한대로 코드가 실행됩니다. 상태 머신 클래스는 모든 변수와 스택을 보존합니다.

3

예, 실제로는 동기 인 async 메소드 내에 일부 경로를 포함하는 것이 허용됩니다.

일반적으로 "빠른"성공/실패 경로이고 실제로는 await을 사용하여 이점을 얻을 수있는 "느린"경로 일뿐입니다 (예제와 같이).

관련 문제