gpt4 book ai didi

c# - .Net 核心 : nvalidOperationException: An attempt was made to use the context while it is being configured

转载 作者:行者123 更新时间:2023-12-05 02:56:10 27 4
gpt4 key购买 nike

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

InvalidOperationException: An attempt was made to use the context while it is being configured. A DbContext instance cannot be used inside OnConfiguring since it is still being configured at this point. This can happen if a second operation is started on this context before a previous operation completed. Any instance members are not guaranteed to be thread safe. Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider()

StartUp.cs

services.AddDbContext<myDbContext>(options => options.UseSqlServer(_config.GetConnectionString("DefaultConnection")));

我在当前任务中使用的服务:

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

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

         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);

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

        //#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);

最佳答案

您所做的显然违反了 Microsoft 文档中所述的内容。关于 Entity Framework Core。

Entity Framework Core does not support multiple parallel operations being run on the same DbContext instance

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

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

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

关于c# - .Net 核心 : nvalidOperationException: An attempt was made to use the context while it is being configured,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60759641/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com