Voici mon code:
var banner = context.Banners.ToListAsync()
var newsGroup = context.NewsGroups.ToListAsync()
await Task.WhenAll(banner, newsGroup);
Mais quand j'ai appelé la fonction du contrôleur. Il a montré une erreur
Une deuxième opération a démarré sur ce contexte avant la fin d'une opération asynchrone précédente. Utilisez 'await' pour vous assurer que toutes les opérations asynchrones sont terminées avant d'appeler une autre méthode sur ce contexte. Les membres d'instance ne sont pas garantis d'être thread-safe.
Aidez-moi à résoudre ce problème.
Réponses:
L'exception explique clairement qu'il n'y a qu'une seule opération asynchrone par contexte autorisée à la fois.
Donc, vous devez les utiliser
await
un à la fois comme le suggère le message d'erreur:var banner = await context.Banners.ToListAsync(); var newsGroup = await context.NewsGroups.ToListAsync();
Ou vous pouvez utiliser plusieurs contextes:
var banner = context1.Banners.ToListAsync(); var newsGroup = context2.NewsGroups.ToListAsync(); await Task.WhenAll(banner, newsGroup);
la source
Si vous utilisez le conteneur IoC pour votre injection de fournisseur de données, envisagez d'utiliser le type «transitoire» ou «PerWebRequest» pour votre cycle de vie.
Par exemple: https://github.com/castleproject/Windsor/blob/master/docs/lifestyles.md
la source
Si vous utilisez Unity pour l'injection de dépendances avec, par exemple, un modèle de référentiel, vous obtiendrez l'erreur suivante en utilisant au moins deux contextes avec create / update / delete:
Cela peut être résolu en utilisant
PerRequestLifetimeManager
. Plus d'infos ici:C # EF6 effectue plusieurs appels asynchrones vers un contexte à l'aide de Unity - Asp.Net Web Api
container.RegisterType<DbContext>(new PerRequestLifetimeManager()); container.RegisterType<ISupplierRepository, SupplierRepository>(); container.RegisterType<IContactRepository, ContactRepository>();
la source