为什么以下代码没有await关键字就无法运行?

时间:2019-06-03 00:46:09

标签: c# asynchronous asp.net-core async-await

我有一个名为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
}

1 个答案:

答案 0 :(得分:-1)

我找到了解决方案。问题出在EF上-我​​的DbContext被处置了(我认为这没有引发多线程的异常原因)。我需要为ICloneableDbContext实现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);
}