我有一個這樣的異步方法:
private async Task TaskAsync()
{
await Task.Run(() => Task.Delay(2000));
}
然后我在一個按鈕點擊事件中呼叫它,我已經這樣宣告了:
private async void button1_Click(object sender, EventArgs e)
{
await TaskAsync();
MessageBox.Show("Afterwards.");
}
現在,當我單擊按鈕時,TaskAsync()實際上是在等待,并且直到TaskAsync()執行完成才會顯示訊息框。但是,當我在單擊事件中await呼叫時洗掉命令時TaskAsync(),執行立即跳轉到訊息框。
我在這里做錯了嗎?這是 async...await 的正常行為嗎?
我的專案是一個 .NET Core 5 C# winform 專案。
uj5u.com熱心網友回復:
這里有兩個問題。首先,該TaskAsync方法Task.Run用于運行另一個異步方法。那只會浪費一個執行緒。它應該只是:
private async Task TaskAsync()
{
await Task.Delay(2000);
}
如果不
private Task TaskAsync()=>Task.Delay(2000);
其次,如果沒有等待任務執行將立即進行。這就是使用的全部意義await——等待一個已經在執行的異步任務完成而不阻塞呼叫執行緒。
原始代碼相當于:
private async void button1_Click(object sender, EventArgs e)
{
await Task.Delay(2000);
MessageBox.Show("Afterwards.");
}
如果沒有await,則回傳的任務Task.Delay()將被忽略并立即顯示訊息框。
如果要開始一個較長的操作,例如讀取一個大檔案,并同時顯示一條訊息,可以將任務存盤在一個欄位中,并在對話框關閉后等待:
private async void button1_Click(object sender, EventArgs e)
{
var task=File.ReadAllTextAsync(...);
MessageBox.Show("Reading a file");
var text=await task;
MessageBox.Show("Afterwards.");
}
或者
private async void button1_Click(object sender, EventArgs e)
{
var task=Task.Run(()=>SomeBackgroundProcessing(someArgs));
MessageBox.Show("Processing");
var text=await task;
MessageBox.Show("Afterwards.");
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/315634.html
標籤:winforms 异步 异步等待 事件处理 .net-5
上一篇:從另一個標簽頁獲取值
