我有一个名为myMethodAsync
的方法,需要执行该方法,制作一些东西,然后运行DoSomeWork
方法-但是它不需要等到该方法完成之后。
这是一个使用Entity Framework Core和内置依赖项注入的asp.net core 2.0应用程序。样本中的每个类别都是作用域。我正在使用存储库模式。没有错误,什么也没有发生。如果在myRepository.GetAsync
之后或在GetAsync
方法中设置断点,调试器将无法进入。
代码:
public async Task myMethodAsync
{
...
await myRepository.AddAsync(entity);
DoSomeWork(id); // If it's lack of await the line below will not works
}
private async Task DoSomeWork(Guid id)
{
...
var someEntity = await myRepository.GetAsync(id); // This line will never be done
}
我认为这是因为myRepository
以某种方式共享,所以我将DoSomeWork
提取到具有自己的myRepository
的其他类上,但是效果是相同的。
此外,如果我使用Task.Run
,则没有任何改变。
我怎么知道代码永远不会执行?因为我要更改实体,以后再将其更新到数据库。但是实体不会更改。
真正有趣的是,以下代码几乎可以正常工作:
public async Task myMethodAsync
{
...
await myRepository.AddAsync(entity);
DoSomeWork(id); // Now it almost works
await myRepository.GetAsync(randomID);
}
private async Task DoSomeWork(Guid id)
{
...
var someEntity = await myRepository.GetAsync(id); // It works now
...
await myRepository.UpdateAsync(entity); // But it doesn't work
}
答案 0 :(得分:-1)
我找到了解决方案。问题出在EF上-我的DbContext被处置了(我认为这没有引发多线程的异常原因)。我需要为ICloneable
和DbContext
实现myRepository
接口。现在,我正在传递myRepository的克隆版本,并且一切正常。
public async Task myMethodAsync
{
...
await myRepository.AddAsync(entity);
DoSomeWork(id, (Repository)myRepository.Clone());
}
private async Task DoSomeWork(Guid id, Repository clonedRepository)
{
...
var someEntity = await clonedRepository.GetAsync(id);
}