尝试使用EF异步检索数据时出现'ObjectDisposedException'

时间:2017-10-30 13:54:35

标签: wpf multithreading entity-framework asynchronous

所以我有两个表:RecipeStep。一个食谱包含多个步骤。

我有一个WPF应用程序,当我加载特定视图时,我想使用Entity Framework异步加载数据。所以我有这个功能

public async Task<List<recipe>> GetRecipeAsync()
{
    using (var context = new RecipeSystem())
    {
        return await context.recipe.ToListAsync();
    }
}

在我的类的构造函数中,我正在调用上面的函数:

Recipes = _recipeService.GetRecipeAsync().Result;

但由于某种原因,我得到一个ObjectDisposedException。

Exception

如果我在GetRecipeAsync()中设置断点并检查context.recipe.ToListAsync()具有什么值,那么它看起来很好。那里有步骤。

1 个答案:

答案 0 :(得分:1)

在处理完上下文后,无法延迟加载相关的Step对象。您可以尝试使用预先加载来预先加载相关实体:

public async Task<List<recipe>> GetRecipeAsync()
{
    using (var context = new RecipeSystem())
    {
        return await context.recipe.Include(x => x.Steps).ToListAsync().ConfigureAwait(false);
    }
}

另请注意,通过调用async方法来禁用ConfigureAwait(false)服务方法中的上下文捕获是一种很好的做法。这也可以帮助您避免死锁:http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html