【问题标题】:EF + async = The context cannot be used while the model is being created?EF + async = 创建模型时不能使用上下文?
【发布时间】:2012-05-03 17:46:59
【问题描述】:

设置非常标准。使用 SQL Server 连接字符串创建了一个视图和存储库。将视图模型传递给存储库,并在视图模型的构造函数上调用存储库中的集合。在我尝试使用 async/await 组合异步执行此操作之前一切正常,但现在在调用存储库的集合时出现错误“在创建模型时无法使用上下文”。

旧的工作代码:

void FillPeopleList()
{
  PeopleList = _repository.GetPeople();
}

新的破代码:

async void FillPeopleList()
{
  await Task.Run(()=>
  {
    PeopleList = _repository.GetPeople(); // Error
  });
}

【问题讨论】:

    标签: c# wpf entity-framework


    【解决方案1】:

    EF 不是线程安全的。

    您不能在多个线程上使用相同的上下文。

    【讨论】:

    • @Manuel:正确; Task.Run 在不同的线程上运行。你认为那是什么?
    • 在任务中包装一个方法。那么如何使用 await 运行 void 方法? (不旋转新线程)
    • @Manuel:这没有任何意义。 await 的全部意义在于等待某事完成。如果它无论如何都在 UI 线程中运行,则无需等待。
    • 你不需要单独的线程来异步运行东西。您使用回调来确保您不会阻塞线程。 Await 和 async 为你做回调包装。在这种情况下,我是说继续做事,当存储库响应时继续块(之后什么都没有,但这无关紧要)。
    • @Manuel:但是您希望GetPeople() 在哪里/如何运行?
    猜你喜欢
    • 1970-01-01
    • 2019-07-28
    • 2016-12-18
    • 2011-08-31
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    相关资源
    最近更新 更多