IAsyncEnumerable에서 .NET 코어 3.0 <T> 큰 거래는 무엇입니까?

가장 흥미로운 기능 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 매우 인기있는 새로운 속성, 많은 경우에, 그것은 코드가 더 작고 더 효율적으로 만들 수 있습니다.

자세한 내용은 다음 리소스를 참조하십시오 :

추천

출처www.cnblogs.com/yixuanhan/p/11691303.html