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)
您所做的显然违反了微软文档中的规定。关于实体框架核心。
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 密集型任务。
| 归档时间: |
|
| 查看次数: |
7334 次 |
| 最近记录: |