【发布时间】:2020-09-30 06:35:44
【问题描述】:
我开始尝试将我的数据库查询转换为异步的,但我真的不明白如何正确地做到这一点。
我现在收到错误:
在前一个操作完成之前,在此上下文中启动了第二个操作。这通常是由使用相同 DbContext 实例的不同线程引起的。有关如何避免 DbContext 线程问题的更多信息
public async Task<IList<MyObject>> GetAll(MyContext context)
{
return (await Task.WhenAll(
MethodA(context), MethodB(context)))
.SelectMany(e => e)
.ToList();
}
private async Task<IList<MyObject>> MethodA(MyContext context)
{
return await context.MyThings.Include(x => x.Stuff)
//full query removed for readability
.ToListAsync();
}
private async Task<IList<MyObject>> MethodB(MyContext context)
{
return await context.MyThings.Include(x => x.Stuff)
//full query removed for readability
.ToListAsync();
}
index.cs:
public Task<IList<MyObject>> MyDBList { get; set; }
public void OnGet()
{
MyDBList = _myInterface.GetAll_context);
}
索引.cshml
@foreach (var x in Model.MyDBList)
{
<p>x.ID</p>
}
我厌倦了使 dbcontext 瞬态,但它没有任何区别。我还担心它会破坏我更新数据库中条目的许多其他代码。
我可以看到错误发生的原因,我在同一个上下文中运行两个查询,但我不知道如何修复它。
谁能给点建议?
【问题讨论】:
-
异常说的是,DbContext 不是线程安全的。您可以在多个线程中使用它,无论是否是瞬态的。
-
对不起,我不明白你的意思。我明白为什么会出现错误,但我不知道如何强制它使用自己的 DBContext。
标签: entity-framework asp.net-core-3.1