Вы не ожидаете первого задания, таким образом, оно становится заданием fire-and-Forgot . Если следующая строка, скажем, конец консольного приложения Main()
, то программа завершит работу до завершения остальных задач! Удаление задержки увеличит вероятность того, что другие задачи будут выполнены вовремя.
Это веб-приложение ASP.NET.
В этом случае вы должны использовать async
"полностью" , что означает, что вы не только должны иметь await
здесь:
Task t = Task.Run( async ( ) => { ... }
... становится
await Task.Run( async ( ) => { ... }
... но также и все дерево вызовов вплоть до метода контроллера ASP.NET
public async Task SomeMethodOnMyController ()
{
await SomethingAsync();
}
async Task SomethingAsync()
{
// do something thrilling here
await _emailSystem.SendEmailsAsync();
// do something thrilling here
}
... где SendEmailsAsync
- это, по сути, ваш код, указанный в вопросе.
Если вы этого не сделаете, есть вероятность, что ASP.NET не будет знать, что метод выполняет асинхронные операции, и может преждевременно перезапустить ваш AppDomain до завершения обработки электронной почты.
РЕДАКТИРОВАТЬ: для веб-форм ASP.NET
Примером будет что-то вроде
protected async void OnClick(object sender, EventArgs e)
{
await // rest of code here;
}
Расскажите подробнее