DbContext
实例这是推荐的做法。每个线程或任务都应该有自己的 DbContext
实例,避免多个线程共享同一个实例。你可以在每个线程或任务中创建一个新的 DbContext
实例,并在任务完成后将其释放。
public class MyJob
{
private readonly DbContextOptions<MyDbContext> _options;
public MyJob(DbContextOptions<MyDbContext> options)
{
_options = options;
}
public async Task ExecuteAsync()
{
using (var context = new MyDbContext(_options))
{
// 在这里执行数据库操作
var data = await context.MyEntities.ToListAsync();
// 其他操作...
}
}
}
// 在并发执行时,每个任务都会创建自己的 DbContext 实例
var tasks = new List<Task>();
for (int i = 0; i < 10; i++)
{
var job = new MyJob(options);
tasks.Add(job.ExecuteAsync());
}
await Task.WhenAll(tasks);
DbContext
生命周期如果你使用的是依赖注入框架(如 ASP.NET Core 的内置 DI),你可以将 DbContext
注册为 Scoped
生命周期。这意味着每个请求或每个任务会有一个独立的 DbContext
实例。在多线程环境中,你需要确保每个线程或任务都有自己的作用域,并从该作用域中获取 DbContext
实例。
// 在 ASP.NET Core 中注册 DbContext
services.AddDbContext<MyDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
// 在多线程环境中使用
var scopeFactory = serviceProvider.GetRequiredService<IServiceScopeFactory>();
var tasks = new List<Task>();
for (int i = 0; i < 10; i++)
{
using (var scope = scopeFactory.CreateScope())
{
var context = scope.ServiceProvider.GetRequiredService<MyDbContext>();
tasks.Add(Task.Run(async () =>
{
// 使用 context 执行数据库操作
var data = await context.MyEntities.ToListAsync();
// 其他操作...
}));
}
}
await Task.WhenAll(tasks.ToArray());
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。