이것은 내 코드입니다.
var banner = context.Banners.ToListAsync()
var newsGroup = context.NewsGroups.ToListAsync()
await Task.WhenAll(banner, newsGroup);
하지만 컨트롤러에서 함수를 호출했을 때. 오류를 보였습니다
이전 비동기 작업이 완료되기 전에이 컨텍스트에서 두 번째 작업이 시작되었습니다. 이 컨텍스트에서 다른 메서드를 호출하기 전에 비동기 작업이 완료되었는지 확인하려면 ‘await’를 사용하십시오. 모든 인스턴스 멤버는 스레드 안전이 보장되지 않습니다.
이 문제를 해결하도록 도와주세요.
답변
예외는 한 번에 허용되는 컨텍스트 당 하나의 비동기 작업 만 있음을 명확하게 설명합니다.
따라서 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);
답변
데이터 공급자 삽입에 IoC 컨테이너를 사용하는 경우 수명주기에 “일시적”또는 “PerWebRequest”유형을 사용하는 것이 좋습니다.
예 : https://github.com/castleproject/Windsor/blob/master/docs/lifestyles.md
답변
예를 들어 리포지토리 패턴과 함께 종속성 주입에 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>();