Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架6,加载实体异步/等待_C#_Async Await_Entity Framework 6 - Fatal编程技术网

C# 实体框架6,加载实体异步/等待

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

我想从数据库中重新加载某些实体,因为我想使用async/await重新加载它们。这是我的密码:

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-谢谢。我已经测试了您的最新建议,没有错误,并且认为这解决了问题问题。