Я надеялся, что цикл будет проходить через всех клиентов и отправлять электронные письма;не нужно ждать отправки электронного письма, прежде чем перейти к следующему.
Ваш цикл этого не делает.Это фактически делает одно электронное письмо за один раз.Однако вызывающий поток немедленно получает управление.
Эта строка ниже фактически гласит: «сделайте это в другом потоке, а затем продолжите запускать этот метод после завершения».Между тем, поскольку await
не блокируется, вызывающий поток продолжает выполнение.
await SendReport(customer.Id, repTypeId, freqName);
Я бы предложил это вместо этого, который запускает все ваши отчеты и выполняет await
для завершения всех из них.:
await Task.WhenAll(_dbContext.Customer.Select(x => SendReport(x.Id, repTypeId, freqName));
Я также настоятельно рекомендую всегда возвращать Task
при использовании async
:
public async Task SendReportsToCustomers()
Таким образом, вызывающая сторона может await
или делать все, что пожелаетс возвращаемым значением.Вы даже можете заблокировать его с помощью Task.Result
.
Чего я не понимаю, так это почему мой цикл не продолжит цикл по всем клиентам?- есть больше работы для этого.Не уверен, почему он вернется к основной функции.
См. await
документацию , чтобы лучше понять ее использование и неблокирующую природу.
Вна очень высоком уровне вы можете думать о await
как о том, что «не выполняйте оставшуюся часть этого метода до тех пор, пока эта задача не будет выполнена, но не блокируйте и то и другое».