To jest mój kod:
var banner = context.Banners.ToListAsync()
var newsGroup = context.NewsGroups.ToListAsync()
await Task.WhenAll(banner, newsGroup);
Ale kiedy wywołałem funkcję z kontrolera. Pokazał błąd
Druga operacja rozpoczęła się w tym kontekście przed zakończeniem poprzedniej operacji asynchronicznej. Użyj „await”, aby upewnić się, że wszystkie operacje asynchroniczne zostały zakończone przed wywołaniem innej metody w tym kontekście. Żaden element członkowski instancji nie gwarantuje bezpieczeństwa wątków.
Proszę, pomóż mi rozwiązać ten problem.
Odpowiedzi:
Wyjątek wyjaśnia wyraźnie, że w danym momencie jest tylko jedna operacja asynchroniczna na kontekst.
Więc albo musisz
await
je pojedynczo, jak sugeruje komunikat o błędzie:var banner = await context.Banners.ToListAsync(); var newsGroup = await context.NewsGroups.ToListAsync();
Lub możesz użyć wielu kontekstów:
var banner = context1.Banners.ToListAsync(); var newsGroup = context2.NewsGroups.ToListAsync(); await Task.WhenAll(banner, newsGroup);
źródło
Jeśli używasz kontenera IoC do wstrzyknięcia dostawcy danych, rozważ użycie typu „przejściowy” lub „PerWebRequest” dla swojego cyklu życia.
Na przykład: https://github.com/castleproject/Windsor/blob/master/docs/lifestyles.md
źródło
Jeśli używasz Unity do iniekcji zależności z na przykład wzorcem repozytorium, otrzymasz następujący błąd przy użyciu dwóch lub więcej kontekstów z tworzeniem / aktualizowaniem / usuwaniem:
Można to rozwiązać za pomocą
PerRequestLifetimeManager
. Więcej informacji tutaj:C # EF6 wykonaj wiele wywołań asynchronicznych do jednego kontekstu przy użyciu aparatu Unity - Asp.Net Web Api
container.RegisterType<DbContext>(new PerRequestLifetimeManager()); container.RegisterType<ISupplierRepository, SupplierRepository>(); container.RegisterType<IContactRepository, ContactRepository>();
źródło