При преобразовании существующего синхронного метода в async я случайно использовал «асинхронный void» для одного из методов, что привело к неожиданному поведению.DbContext, находящийся слишком рано в методе Async
Ниже приведен упрощенный пример такого изменения я фактически выполненным,
public IActionResult Index()
{
var vm = new ViewModel();
try
{
var max = 0;
if (_dbContext.OnlyTable.Any())
{
max = _dbContext.OnlyTable.Max(x => x.SomeColumn);
}
_dbContext.Add(new TestTable() { SomeColumn = max + 1 });
_dbContext.SaveChanges();
MakePostCallAsync("http:\\google.com", vm);
if (!string.IsNullOrEmpty(vm.TextToDisplay))
{
vm.TextToDisplay = "I have inserted the value " + newmax + " into table (-1 means error)";
}
else
{
vm.TextToDisplay = "Errored!";
}
}
catch (Exception ex)
{
vm.TextToDisplay = "I encountered error message - \"" + ex.Message + "\"";
}
return View("Index", vm);
}
private async void MakePostCallAsync(string url, ViewModel vm)
{
var httpClient = new HttpClient();
var httpResponse = await httpClient.PostAsync("http://google.com", null).ConfigureAwait(true);
newmax = _dbContext.OnlyTable.Max(x => x.SomeColumn);
}
Вопрос заключается в том, что метод MakePostCallAsync()
, при попытке запроса к базе данных с помощью DbContext, бросает исключение, говоря DbContext является уже размещены.
_dbContext
в примере вводится с использованием расширения ASP .Net Core (через расширение AddDbContext()) с его областью по умолчанию (область действия).
я не и должен помочь понять следующее,
- почему контекст DB расположен еще до запроса подается, в то время как срок служба контекстного объекта должна быть всей продолжительностью текущего запроса
- Даже хотя я использовал ConfigureAwait (true) (что явно означает, что после того, как ожидаемый метод возвращает MakePostCallAsync(), должен продолжаться в контексте запроса?) - это, похоже, не происходит
- В фактическом коде это было исправлено после того, как я сделал все методы async (вплоть до контроллера) - в репродукции у меня есть sh isd, даже это не помогает предотвратить исключение - почему это так, как я могу это решить?
Репро доступен в https://github.com/jjkcharles/SampleAsync
Но почему контекст запроса не сохраняется даже после того, как я попросил его сохранить (ConfigureAwait (True)). Кроме того, ожидание на MakePostCallAsync() не изменило способ поведения кода –