C# EF+;async=在创建模型时不能使用上下文?
设置相当标准。使用SQL Server连接字符串创建了视图和存储库。将视图模型传递给存储库,并在视图模型的构造函数上调用存储库中的集合。在我尝试使用async/await组合异步执行之前,一切都很正常,但现在在调用存储库集合时出现错误“在创建模型时无法使用上下文” 旧工作代码:C# EF+;async=在创建模型时不能使用上下文?,c#,wpf,entity-framework,C#,Wpf,Entity Framework,设置相当标准。使用SQL Server连接字符串创建了视图和存储库。将视图模型传递给存储库,并在视图模型的构造函数上调用存储库中的集合。在我尝试使用async/await组合异步执行之前,一切都很正常,但现在在调用存储库集合时出现错误“在创建模型时无法使用上下文” 旧工作代码: void FillPeopleList() { PeopleList = _repository.GetPeople(); } 新的坏代码: async void FillPeopleList() { awai
void FillPeopleList()
{
PeopleList = _repository.GetPeople();
}
新的坏代码:
async void FillPeopleList()
{
await Task.Run(()=>
{
PeopleList = _repository.GetPeople(); // Error
});
}
EF不是线程安全的
不能在多个线程上使用同一上下文。@Manuel:Correct;这是在不同线程上运行的
Task.Run
。你认为它做什么?在任务中包装一个方法。如何使用wait运行void方法?(没有纺新的线)@Manuel:那没有任何意义。等待的全部意义就是等待某事完成。如果它在UI线程中运行,那么就没有什么可等待的了。异步运行东西不需要单独的线程。您可以使用回调来确保不阻塞线程。wait和async为您完成回调包装。在这种情况下,我说的是继续做一些事情,当存储库响应时,继续执行块(后面没有任何内容,但这无关紧要)。@Manuel:但是您希望GetPeople()
在哪里/如何运行?