[英]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
,它將返回給調用方。 一旦返回了可等待的方法( 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;
}
即使關閉了父進程,異步查詢也會執行嗎?
不,或者至少不是延續。 如果您發送電子郵件並退出應用程序,則不一定阻止電子郵件發送。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.