가장 흥미로운 기능 C # 8.0과 3.0, 하나 .NET 코어 IAsyncEnumerable <T> (즉, 비동기 흐름)이다. 그러나 특별한 무엇? 우리는 지금 불가능 이전에 어떤 일을 수행하는 데 사용할 수 있습니다?
이 글에서, 우리는 IAsyncEnumerable을 배우게됩니다 <T>를 구현하는 방법을, 해결해야 할 과제가 무엇 왜 IAsyncEnumerable <T> 우리 자신의 애플리케이션에서 많은 경우에 작업 <는 IEnumerable <T >>를 대체합니다.
아마도 가장 좋은 증거 IAsyncEnumerable <T는> 직면하게되는 어려움이 없을 때 볼 수있는 유용한 방법입니다.
예를 들어, 모든의 첫 번째 페이지의 모든 게시물을 얻을 같은 코드의 이러한 조각은있다 :
공공 비동기 작업 <IEnumerable을 <포스트 >> GetPagePostsFromLikes ( INT PAGENUMBER) { // 생략 달성 할 }
그런 다음 위의 코드를 호출하는 코드의 다른 부분이있다 :
공공 비동기 작업 <IEnumerable을 <포스트 >> ) (GetAllPostsFromLikes { var에 allPosts = 새로운 목록 <포스트> (); 대 ( INT의 페이지 = 0 ; 페이지 ++ ) { var에 게시물 =이 기다리고 GetPagePostsFromLikes (페이지) 만약 (! posts.Any ()) { 반환 allPosts을; } allPosts.AddRange (게시물); } }
각 페이지 및 목록 <포스트>에 결과를 통해 위의 방법에 문제가 있음을 우리는 루프를 참고하고, 마지막으로 전체 결과를 반환합니다. 페이지 일억 페이지 포스트, 페이지 게시물 반환 값 전에로드 할 필요가 페이지의 모든이 수십억 달러가 가정하자. 분명히 매우 비효율적.
어쩌면 우리는 사용할 수 없습니다 작업을 위의 방법을 대체 :
공공 는 IEnumerable <포스트> GetAllPostsFromLikes () { 대 ( INT의 페이지 = 0 ; 페이지 ++ ) { var에 게시물 =의 GetPagePostsFromLikes (페이지) .GetAwaiter () getResult를 ().; 만약 (! posts.Any ()) { 산출 휴식 ; } foreach는 ( var에 포스트 에서 포스트) { 양보 반환 게시물을; } } }
위의 코드에서,는 IEnumerable <T>를 반환 방법 호출자에게 리턴 데이터의 각 부분에 대한 반환 문을 생성하는데 사용될 수있다.
그러나, 그것을하지 않습니다! 동일한 스레드에 대한 동시 액세스의 충분한 수있을 때 위의 코드는 우리가 비동기 방식에서 세 번째 함수를 호출하는 경우가 완료 될 때까지 스레드 풀은 반복 IEnumerable을 반환을 계속된다는 것을 의미합니다, 즉, 방해를 일으킬 수밖에 없다.
우리가 잘 수율 반환을 사용하는 비동기 방법을 사용할 수 있다면! 불행하게도, 지금까지 ...... 불가능하다.
외관 그것과 관련이 시간 IAsyncEnumerable <T>! ! ! ! ! !
IAsyncEnumerable <T>는 .NET 코어 3 (.NET 표준 2.1)에 도입한다. 어떤 MoveNextAsync () 메소드를 기다릴 수 열거를 갖는 계수기를 개시한다. 이것은 생산자가 생산 결과 사이의 비동기 호출을 할 수 있다는 것을 의미한다.
그리고 작업으로 돌아가 <는 IEnumerable <T >> 다른, 우리의 접근 방식은 지금 IAsyncEnumerable <T>를 반환하고, 수율 반환을 사용하여 데이터를 전송 할 수 있습니다 :
공공 비동기 IAsyncEnumerable <포스트> ) (GetAllPostsFromLikes { 대 ( INT의 페이지 = 0 ; 페이지 ++ ) { var에 게시물 =의 GetPagePostsFromLikes (페이지) .GetAwaiter () getResult를 ().; 만약 (! posts.Any ()) { 산출 휴식 ; } foreach는 ( var에 포스트 에서 포스트) { 양보 반환 게시물을; } } }
결과를 사용하기 위해, 우리는 foreach는 () 구문을 기다리고 처음 C # 8를 사용해야합니다 :
기다리고 foreach 문을 ( var에 포스트 에서 postsRepository.GetAllPostsFromLikes ()) { Console.WriteLine (게시물); }
이 훨씬 낫다. 데이터를 생성하는 방법이 가능하다. 데이터를 사용하여 자신의 걸음에 코드를 호출.
유효 흐름 HTTP 응답 데이터를 데이터베이스에서 - ASP.NET은 IAsyncEnumerable은 <T> .NET 핵심 API에서 우리가 방법의 직접적인 결과를 반환 할 수 있음을 의미 컨트롤러 액션, 3.0 미리보기 (7)를 시작 반환 할 수 있습니다.
[HttpGet] 공중 IAsyncEnumerable <포스트> 오기 () => postsRepository.GetAllPostsFromLikes ();
시간이 지남에 따라, .NET Core3.0 및 .NET Standard2.1의 발전과 함께, 우리는 IAsyncEnumerable가 <T> 우리가 일반적으로 작업을 <사용을 IEnumerable <T >>에 사용되는 볼 수 있습니다.
개요
IAsyncEnumerable <T>는입니다. NET 매우 인기있는 새로운 속성, 많은 경우에, 그것은 코드가 더 작고 더 효율적으로 만들 수 있습니다.
자세한 내용은 다음 리소스를 참조하십시오 :