簡體   English   中英

當用戶關閉在異步事件處理程序中執行異步任務的表單時會發生什么?

[英]What happens when the user closes a form performing an async task in an async event handler?

我正在為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";
   }
}

我已經進行了一些測試,甚至在SendEmail放置了一個很長的Thread.Sleep (在它實際發送電子郵件之前),並在睡眠期間關閉了表單,最終電子郵件被發送了。

為什么會這樣呢?

即使關閉了父進程,異步查詢也會執行嗎?

async方法(例如事件處理程序)命中await ,它將返回給調用方。 一旦返回了可等待的方法( IsSomethingValidSendEmail ),將執行async方法的其余部分( btn_ButtonClick )。

您在等待方法( IsSomethingValidSendEmail )返回之前關閉表單的事實並沒有阻止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;
}

即使關閉了父進程,異步查詢也會執行嗎?

不,或者至少不是延續。 如果您發送電子郵件並退出應用程序,則不一定阻止電子郵件發送。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM