Когда метод async
, такой как ваш обработчик событий, достигает значения await
, он возвращается к вызывающей стороне. После возвращения ожидаемого метода (IsSomethingValid
или SendEmail
) будет выполнен остаток от метода async
(btn_ButtonClick
).
Тот факт, что вы закрываете форму до возвращения ожидаемого метода (IsSomethingValid
или SendEmail
), не останавливает выполнение остальной части метода async
(btn_ButtonClick
).
Если вы не хотите ничего делать после закрытия формы, вы можете использовать флаг, который отслеживает, была ли она закрыта, например ::
public Form1()
{
InitializeComponent();
FormClosed += Form1_FormClosed;
}
private async void btn_ButtonClick(object sender, EventArgs e)
{
var isValid = await IsSomethingValid();
if (isValid && !_isClosed) //<--
{
MessageBox.Show("!");
}
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e) => _isClosed = true;
private async Task<bool> IsSomethingValid()
{
await Task.Delay(5000);
return true;
}
Будет ли выполняться асинхронный запрос даже после закрытия родительского процесса?
Нет, или, по крайней мере, не продолжение. Если вы отправляете электронное письмо и выходите из приложения, это не обязательно останавливает отправку электронного письма.