2013-12-17 3 views
69

이 내 코드입니다 :Entity Framework 6에서 다중 비동기?

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

하지만 난 컨트롤러에서 함수를 호출 할 때. 오류가 보임

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

이 문제를 해결할 수 있도록 도와주세요.

+6

예외 분명 크리스탈, 당신이 무엇을 요구하고 있는가? –

+0

2 개의 과제가 있습니다. 만약 내가 각 작업을 실행합니다. 그것은 성공입니다. 하지만 위의 코드를 실행하면. 그것은 –

답변

91

예외적으로 한 번에 허용되는 컨텍스트 당 하나의 비동기 작업 만 있습니다.

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

또는 여러 컨텍스트 사용할 수 있습니다 : 당신이 IoC 컨테이너를 사용하는 경우

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

오류입니다. 고맙습니다. –

+25

그냥 메모, 만약 당신이 기다리는 경우에도 쿼리에서 컨텍스트를 사용하여 같은 오류를 던질 것입니다, 그냥 쿼리 전에 속성을 얻을 게으름 뱅이 변수를 찾으면,이 고통을 발견했다. –

+7

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

4

를 오류 메시지에서 알 수 있듯이

그래서, 당신이 중 하나는 한 번에 await 그 하나가 데이터 공급자 삽입, 수명주기에 "일시적"또는 "PerWebRequest"유형 사용을 고려하십시오.

예를 들어

: 당신은 당신이/업데이 트를 만들어 두 개 이상의 컨텍스트를 사용하여 다음과 같은 오류가 발생합니다 예를 들어 저장소 패턴과 의존성 주입을 위해 유니티를 사용하는 경우 https://github.com/castleproject/Windsor/blob/master/docs/lifestyles.md

1

/삭제 :

의 관계 두 객체가 서로 다른 ObjectContext 객체에 연결되어 있기 때문에 두 객체 사이의 값을 정의 할 수 없습니다.

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

C# EF6 make multiple async calls to one context using Unity - Asp.Net Web Api

container.RegisterType<DbContext>(new PerRequestLifetimeManager()); 
container.RegisterType<ISupplierRepository, SupplierRepository>(); 
container.RegisterType<IContactRepository, ContactRepository>(); 
관련 문제