Что происходит, когда пользователь закрывает форму, выполняя асинхронную задачу в обработчике асинхронных событий? - PullRequest
0 голосов
/ 10 января 2019

Я пишу обработчик асинхронных событий для формы Windows, но у меня нет опыта в том, как C # обрабатывает определенные сценарии, в этом случае закрытие формы во время асинхронной обработки, запускаемой обработчиком асинхронных событий.

Закрытие рассматриваемой формы не прекращает работу всей программы, так как форма была инициализирована другой формой («основной» формой).

Вот как выглядит код, который я пишу:

private void async btn_ButtonClick(...){
   aLabel.Text = "Validating something ...";
   var isValid = await IsSomethingValid(...);
   if (isValid)
       aLabel.Text = "It's valid";

   else{
       aLabel.Text = "Sending email ...";
       await SendEmail(...);
       aLabel.Text = "Email sent";
   }
}

Я провел несколько тестов и даже поместил длинный Thread.Sleep в SendEmail (до того момента, когда он действительно отправляет электронное письмо) и закрыл форму во время этого сна, когда электронное письмо заканчивается отправкой.

Почему это так?

Будет ли выполняться асинхронный запрос даже после закрытия родительского процесса?

1 Ответ

0 голосов
/ 10 января 2019

Когда метод 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;
}

Будет ли выполняться асинхронный запрос даже после закрытия родительского процесса?

Нет, или, по крайней мере, не продолжение. Если вы отправляете электронное письмо и выходите из приложения, это не обязательно останавливает отправку электронного письма.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...