c# - 使用 EF Core dbcontext 运行异步选择时出错
问题描述
public class Person
{
[Key]
public Guid Id { get; set; }
public string FullName { get; set; }
}
public class ApplicationDbContext : DbContext
{
public DbSet<Person> People { get; set; }
}
public class Program
{
public void Main()
{
using var context = new ApplicationDbContext(*configuration here*);
var doWorks = Enumerable.Range(0, 1000).Select(x => context.People.AsNoTracking().ToArrayAsync());
await Task.WhenAll(doWorks);
}
}
我收到此错误:
System.InvalidOperationException: '在前一个操作完成之前,在此上下文上启动了第二个操作。这通常是由使用相同 DbContext 实例的不同线程引起的。有关如何避免 DbContext 线程问题的更多信息,请参阅https://go.microsoft.com/fwlink/?linkid=2097913。
我怎样才能运行这样的多项任务并摆脱该错误?
解决方案
ApplicationDbContext
最简单的方法是在每个任务中创建一个新对象:
public class Program {
public void Main() {
var doWorks = Enumerable.Range(0, 1000).Select(async x => {
using var context = new ApplicationDbContext(*configuration here*);
await context.People.AsNoTracking().ToArrayAsync();
});
await Task.WhenAll(doWorks);
}
}
请注意,我制作了您的 lambdaasync
并使用了await
. 否则,上下文将在查询完成之前被释放。
如果您将此作为负载测试进行,那很好。请注意,在某些情况下,同时执行 1000 个任务可能会比其他方式执行得更差。
推荐阅读
- visual-studio-code - 有没有办法从单独的进程向 VSCode 发送命令?
- twitter-bootstrap - bootstrap3 typeahead keydown , keyup 使所选项目消失
- go - 如何使用 Golang Colly 登录亚马逊
- asp.net - Google OAuth 2.0 得到错误 400:redirect_uri_mismatch,ASP.net core 3.1
- python - 如何从 POST 方法中获取 str 并将其保存在数据库中并在 django 中返回带有 str 的消息?
- google-apps-script - 如何在谷歌日历中正确使用创建事件?
- material-ui - 是否有 API 来检索 Material-UI 的当前版本
- javascript - Socketio:在发送一堆调用时,侦听器接收到不正确的数据
- python - 在 django 中为模型(非用户)设置密码以进行简单身份验证
- python - TypeError:范围对象不可调用