C# 实体框架6,加载实体异步/等待
我想从数据库中重新加载某些实体,因为我想使用async/await重新加载它们。这是我的密码:C# 实体框架6,加载实体异步/等待,c#,async-await,entity-framework-6,C#,Async Await,Entity Framework 6,我想从数据库中重新加载某些实体,因为我想使用async/await重新加载它们。这是我的密码: private async void btnUpdate_Click(object sender, EventArgs e) { Task allTasks = UpdateAppointments(); await allTasks; } internal async Task UpdateAppointments() { IEnumerable<Entities.A
private async void btnUpdate_Click(object sender, EventArgs e)
{
Task allTasks = UpdateAppointments();
await allTasks;
}
internal async Task UpdateAppointments()
{
IEnumerable<Entities.Apointment> apps = PContext.Appointments.Select(p => p).Where(p => p.Start >= Start && p.End <= End && p.MachineId == 66);
List<Task> task = new List<Task>();
foreach (Entities.Apointment app in apps)
{
task.Add(PContext.Entry(app).ReloadAsync());
}
await Task.WhenAll(task);
}
private async void btnUpdate\u单击(对象发送方,事件参数e)
{
Task allTasks=UpdateAppoints();
等待一切任务;
}
内部异步任务更新点()
{
IEnumerable apps=PContext.Appointments.Select(p=>p.Start>=Start&&p.End您必须具体化列表,然后才能对该DbContext
执行其他操作,因为当您枚举IQueryable
时,DbContext
正在积极使用
将解决这个问题,因为在迭代开始之前,所有实体都将从DbContext
中检索
foreach (Entities.Apointment app in apps.ToList()) // added ToList()
如果您想使用async
实现列表,您可以这样做
foreach (Entities.Apointment app in (await apps.ToListAsync()))
编辑评论中的内容
我应该注意到,我得到的错误通常与许多正在重新加载的实体有关(>1000)
我能想到的另一件事是,wait Task.whall(Task);
中存在竞争条件,其中任务(您在本语句前面的循环中定义)同时调用DbContext
。但是,如果没有其他信息,我无法确定地告诉您(让我知道是完全相同的错误还是不同的错误)。在这种情况下,您应该在循环内同步执行每个调用,这仍然可以使用wait/async调用来完成
// note, for readability I changed the explicit types to keyword var to make the code a little more compact and hopefully easier identify the changes
var apps = await PContext.Appointments.Select(p => p).Where(p => p.Start >= Start && p.End <= End && p.MachineId == 66).ToListAsync(); // Retrieve all instances on the context in one call
foreach (var app in apps)
{
await PContext.Entry(app).ReloadAsync(); // execute each Reload synchronously instead of concurrently
}
//注意,为了可读性,我将显式类型更改为keyword var,使代码更紧凑,希望更容易识别更改
var apps=await PContext.appoints.Select(p=>p)。Where(p=>p.Start>=Start&&p.End感谢您的建议。ToList()不起作用。await apps.ToListAsync()有时起作用,有时会产生与以前相同的错误。我应该注意,我得到的错误通常与重新加载的许多实体有关(>1000)@Ivan-我应该注意,我得到的错误通常与许多正在重新加载的实体有关(>1000)
-您能用该错误的详细信息更新您的问题吗(包括异常类型和消息以及内部异常详细信息,如果有的话).@Igor-,请确保我的问题已更新,并包含有关错误的详细信息。@Ivan-我更新了我的答案。这是由于启动了多个都调用ReloadAsync的任务而导致的。您应该使用我刚才发布的代码同步调用它们。@Igor-谢谢。我已经测试了您的最新建议,没有错误,并且认为这解决了问题问题。