EF + async = 当模型正在创建时无法使用上下文?

3

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

旧的可行代码:

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

新的破损代码:

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

10

EF不是线程安全的。

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


@Manuel:正确;它是在不同的线程上运行的Task.Run。你认为它会做什么? - SLaks
将一个方法包装在任务中。我如何使用await运行一个void方法?(不需要启动新线程) - Manuel
@Manuel: 这没有任何意义。 await 的整个目的是等待某些操作完成。如果它已经在 UI 线程中运行,那么就没有什么可等待的了。 - SLaks
你不需要单独的线程来异步运行东西。你可以使用回调函数来确保不阻塞线程。等待和异步操作会为你进行回调包装。在这种情况下,我是说继续做事情,当存储库响应时继续执行块(之后没有其他内容,但这并不重要)。 - Manuel
@Manuel:但是你希望GetPeople()在哪里/如何运行? - SLaks
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接