비동기 적으로 객체 컬렉션을 올바르게 반환하려면 어떻게해야합니까?

.net async-await c# entity-framework-core system.reactive

문제

내 핵심 인터페이스에서 목록을 반환하는 메서드를 정의해야합니다. 내 프로젝트는 async / await의 사용에 크게 의존하므로 코어 참조 / 인터페이스를 가능한 비동기로 정의해야합니다. 또한 데이터 액세스 레이어에 EF7을 사용합니다. 현재 IAsyncEnumerable 모든 곳에서 사용 IAsyncEnumerable 있습니다.

현재 IAsyncEnumerable 을 계속 사용 IAsyncEnumerable 아니면 Task<IEnumerable<T>> 를 사용하여 되돌릴지를 결정하고 있습니다. 이 시점에서 IAsyncEnumerable 은 유망한 것으로 보입니다. EF7도 그것을 사용 하고 있습니다. 문제는, 나는 그것을 모르는 방법을 알아낼 수 없다는 것입니다. 웹 사이트 에는 Ix.Net 을 사용하는 방법을 알려주는 것이 거의 없습니다. IEnumerable 개체에서 사용할 수있는 ToAsyncEnumerable 확장이 있지만이 작업은 비동기 적으로 수행되지 않습니다 (또는 수행합니까?). 또 다른 단점은 아래와 같은 서명이 주어진다는 것입니다.

IAsyncEnumerable GetPersons();

이것은 Task를 반환하는 함수가 아니기 때문에 함수 블록 내에서 async / await를 사용할 수 없습니다.

반면에, 내 직감은 내가 Task<IEnumerable<T>> 를 사용하도록 고수해야한다고 말하고있다. 이것은 물론 문제가 있습니다. EF에는이 형식을 반환하는 확장 메서드가 없습니다. 그것은 ToArrayAsyncToListAsync 확장 메소드를 가지고 있습니다 만, Task<T> 가 공변 (covariant)이 아니기 때문에 메소드 내부에서 기다릴 것을 요구합니다. 이것은 단순히 Task 객체를 반환하면 피할 수있는 추가 작업 을 생성하기 때문에 잠재적으로 문제가됩니다.

내 질문은 : IAsyncEnumerable (선호)을 계속 사용해야하나요? 다시 모든 것을 Task<IEnumerable<T>> (선호하지 않음)로 변경해야합니까? 나는 다른 제안들에 대해서도 열려 있습니다.

인기 답변

IAsyncEnumerable 과 함께 갈 것입니다. 비동기식과 게으른 작업을 유지할 수 있습니다.

Task<IEnumerble> 가 없으면 모든 결과를 메모리에로드하는 Task<IEnumerble> 을 반환해야합니다. 이것은 많은 경우 쿼리되고 필요한 것보다 많은 메모리를 보유하는 것을 의미합니다.

고전적인 경우에는 사용자가 Any on을 호출하는 쿼리가 있습니다. Task<IEnumerable> 이면 모든 결과를 메모리에 먼저로드하고 IAsyncEnumerable 로드하면 하나의 결과만으로 충분합니다.

또한 Task<IEnumerable> 하면 IAsyncEnumerable 을 사용하여 한 번에 결과를 "스트리밍"할 수있는 동시에 메모리의 전체 결과 세트를 동시에 유지해야합니다.

또한 그것이 바로 생태계가 지향하는 방향입니다. 그것은 바로 이번 주 에 Stephen Toub에 의해 제안 된 새로운 라이브러리 에 의해 반응적인 확장에 의해 추가되었고 아마도 다음 버전의 C #에서 기본적으로 지원 될 것입니다.




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.