C# yield return

mohadang·2023년 1월 8일
0

C#

목록 보기
1/5
post-thumbnail

yield를 이용해서 다음처럼 컬렉션형 데이터를 반환할 수 있지만 yeild는 단순히 이런 기능만을 가지고 있는것이 아니다.

다음 함수를 호출하면 어떻게 동작할까 ?

당연히 GetPeople에서 1000000개의 객체를 생성한다 하지만 GetPeople에서 yield로 반환하면

yield 버전

GetPeople에서는 1000개만 만든다. 이름에서도 추측할 수 있듯이 yield 키워드는 로직의 처리를 지연 시킨다.
따라서 ProcessPeople에서 GetPeople 함수 호출할때 실제 함수가 호출이되지 않고 foreach 안에서 객체가 필요로 할때 GetPeople 함수의 진정한 호출이 발생 된다.
yiled는 enumerator를 반환하는 것이다.

비동기식 yeild 반환

GetLines에서는 파일을 읽는 매우 느린 작업을 하고 있다. 이를 처리하기 위해 비동기적으로 처리하는것과 동시에 yield를 이용해서 지연적으로 처리 하고자 한다.

  • 시간이 오래 걸리는 ReadLine 부분을 비동기적으로 처리했다.
  • 파일에서 읽은 한 줄을 반환할때 yield를 이용해서 반환해야 한다.
  • GetLines는 async 함수여서 Task를 반환해야 한다.
  • yeild를 반환하고 있어 IEnumerable을 반환해야 한다.
  • Task, IEnumerable 둘다 반환할 수 없기에 IAsyncEnumerable을 반환하도록 처리해야 한다.
  • GetLinse로 받은 lines는 Async한 Enumerator라서 foreach를 사용할때 await을 붙여 주어야 한다.
profile
mohadang

0개의 댓글