Почему следующий код не работает без ключевого слова await? - PullRequest
0 голосов
/ 03 июня 2019

У меня есть метод с именем myMethodAsync, который необходимо выполнить, создать некоторые вещи и запустить метод DoSomeWork - однако ему не нужно ждать, пока метод будет завершен.

Это приложение asp.net core 2.0, использующее Entity Framework Core и встроенное внедрение зависимостей. Каждый класс в образце Scoped. Я использую шаблон репозитория. Нет ошибки, просто ничего не происходит. Если я устанавливаю точку останова после 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 голосов
/ 03 июня 2019

Я нашел решение. Проблема была с 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...