Entity Framework 6의 다중 비동기?


87

이것은 내 코드입니다.

var banner = context.Banners.ToListAsync()
var newsGroup = context.NewsGroups.ToListAsync()
await Task.WhenAll(banner, newsGroup);

하지만 컨트롤러에서 함수를 호출했을 때. 오류를 보였습니다

이전 비동기 작업이 완료되기 전에이 컨텍스트에서 두 번째 작업이 시작되었습니다. 이 컨텍스트에서 다른 메서드를 호출하기 전에 비동기 작업이 완료되었는지 확인하려면 'await'를 사용하십시오. 모든 인스턴스 멤버는 스레드 안전이 보장되지 않습니다.

이 문제를 해결하도록 도와주세요.


2 개의 과제가 있습니다. 각 작업을 실행하면. 성공입니다. 하지만 위의 코드처럼 실행하면. 오류입니다
An Hv

답변:


119

예외는 한 번에 허용되는 컨텍스트 당 하나의 비동기 작업 만 있음을 명확하게 설명합니다.

따라서 await오류 메시지에서 알 수 있듯이 한 번에 하나씩 수행 해야 합니다.

var banner = await context.Banners.ToListAsync();
var newsGroup = await context.NewsGroups.ToListAsync();

또는 여러 컨텍스트를 사용할 수 있습니다.

var banner = context1.Banners.ToListAsync();
var newsGroup = context2.NewsGroups.ToListAsync();
await Task.WhenAll(banner, newsGroup);

34
참고로, await를 사용하더라도 쿼리에서 컨텍스트를 사용하는 Lazy 변수가 있으면 동일한 오류가 발생하고 쿼리 전에 속성을 가져 오면 이것을 찾는 것이 고통 스러웠습니다.
Pedro.The.Kid

7
@ Pedro.The.Kid : 일반적으로 비동기 DB 액세스와 함께 지연로드를 사용하지 마십시오. 지연로드는 항상 동기식이므로 추가 데이터에 대해 포함 또는 별도 쿼리를 사용하는 것이 훨씬 좋습니다.
Stephen Cleary 2014 년

1
비동기 쿼리 당 컨텍스트가 필요한 특별한 이유가 있습니까? 나는 이것이 상당히 제한적인 요소가되는 것 같다.
Zapnologica

1
@Zapnologica : ES6가 디자인 된 방식입니다. 각 상황에 맞는 단 하나 개의 쿼리를 처리 할 수있는 한 번에 . 따라서 다음 쿼리가 시작되기 전에 하나의 쿼리를 완료하면 하나의 컨텍스트 만 필요합니다. 동시에 여러 쿼리를 수행하려는 경우에만 문제가됩니다.
Stephen Cleary

@StephenCleary, 예외 직전에 아무것도 없기 때문에 해당 쿼리를 찾는 데 어려움을 겪고 있습니다. 현재 실행중인 항목을 찾을 수있는 방법이 있습니까? 감사합니다
Fabio Milheiro


3

예를 들어 리포지토리 패턴과 함께 종속성 주입에 Unity를 사용하는 경우 create / update / delete와 함께 두 개 이상의 컨텍스트를 사용하면 다음 오류가 발생합니다.

두 개체가 서로 다른 ObjectContext 개체에 연결되어 있으므로 두 개체 간의 관계를 정의 할 수 없습니다.

이것은를 사용하여 해결할 수 있습니다 PerRequestLifetimeManager. 여기에 더 많은 정보 :

C # EF6는 Unity-Asp.Net Web Api를 사용하여 하나의 컨텍스트에 대해 여러 비동기 호출을 수행합니다.

container.RegisterType<DbContext>(new PerRequestLifetimeManager());
container.RegisterType<ISupplierRepository, SupplierRepository>();
container.RegisterType<IContactRepository, ContactRepository>();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.