.Net Core:nvalidOperationException:在配置上下文时尝试使用上下文

Off*_*'er 5 c# asynchronous async-await asp.net-core

我尝试并行运行 6 个任务,但每隔一段时间就会收到此错误:

InvalidOperationException:尝试在配置上下文时使用该上下文。实例DbContext无法在内部使用,OnConfiguring因为此时它仍在配置中。如果在前一个操作完成之前在此上下文上启动第二个操作,则可能会发生这种情况。不保证任何实例成员都是线程安全的。Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider()

启动.cs

services.AddDbContext<myDbContext>(options => options.UseSqlServer(_config.GetConnectionString("DefaultConnection")));
Run Code Online (Sandbox Code Playgroud)

我用于当前任务的服务:

services.AddScoped<IPostService, PostService>();
services.AddScoped<IPartnerService, PartnerService>();
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddScoped<IRelatedRepository, RelatedRepository>();
services.AddSingleton<ICookieRepository, CookieRepository>();
Run Code Online (Sandbox Code Playgroud)

我尝试运行任务并获得异常的方式:

var relatedTipsTask = Task.Run(() => GetRelatedTipsVms(citiesIDs, countriesIDs, categoriesIDs, bigNumToTake, tipID));
////#1.2 Get related texts widgets
var relatedTextsTask = Task.Run(() => GetRelatedTextsVms(citiesIDs, countriesIDs, categoriesIDs, smallNumToTake, textID));
////#1.3 Get related partners widgets
var relatedPartnersTask = Task.Run(() => GetRelatedPartnersVms(smallNumToTake, partnerID));
////#1.4 Get related post widgets
var relatedPostsTask = Task.Run(() => GetRelatedPostsVms(citiesIDs, countriesIDs, smallNumToTake, postID));
////#1.5 Get related businesses
var relatedBusinessesTask = Task.Run(() => GetRelatedBusinessVms(citiesIDs, countriesIDs, smallNumToTake, businessID));
////#1.6 Get related preflight
var relatedPreflightTask = Task.Run(() => GetRelatedPreflightVms(bigNumToTake, textID));
await Task.WhenAll(relatedTipsTask, relatedTextsTask, relatedPartnersTask, relatedPostsTask, relatedBusinessesTask, relatedPreflightTask);
Run Code Online (Sandbox Code Playgroud)

第二个问题,当我像这样运行它时,它工作正常,但是同步(不是异步),这是为什么?

//#1.1 Get related tips widgets
var relatedTipsTask = GetRelatedTipsVms(citiesIDs, countriesIDs, categoriesIDs, bigNumToTake, tipID);
//#1.2 Get related texts widgets
var relatedTextsTask = GetRelatedTextsVms(citiesIDs, countriesIDs, categoriesIDs, smallNumToTake, textID);
//#1.3 Get related partners widgets
var relatedPartnersTask = GetRelatedPartnersVms(smallNumToTake, partnerID);
//#1.4 Get related post widgets
var relatedPostsTask = GetRelatedPostsVms(citiesIDs, countriesIDs, smallNumToTake, postID);
//#1.5 Get related businesses
var relatedBusinessesTask = GetRelatedBusinessVms(citiesIDs, countriesIDs, smallNumToTake, businessID);
//#1.6 Get related preflight
var relatedPreflightTask = GetRelatedPreflightVms(bigNumToTake, textID);
await Task.WhenAll(relatedTipsTask, relatedTextsTask, relatedPartnersTask, relatedPostsTask, relatedBusinessesTask, relatedPreflightTask);
Run Code Online (Sandbox Code Playgroud)

Yta*_*tan 7

您所做的显然违反了微软文档中的规定。关于实体框架核心。

Entity Framework Core 不支持在同一 DbContext 实例上运行多个并行操作

https://learn.microsoft.com/en-us/ef/core/miscellaneous/configuring-dbcontext

上述两种执行风格之间的主要区别在于,第一种执行风格会导致多个线程尝试利用数据库上下文。我建议你制作你的回购协议。方法。异步(EF Core内置了async.方法),让框架来管理资源,而不是使用Task.Run来执行IO任务。

另外,根据经验,Task.Run 用于 CPU 密集型任务,而 async/await 用于 I/O 密集型任务。