C# ansyc/await/Task用法
注:Task要在.Net 4.5 環境下有效,似乎是因爲:
從 C# 7 開始,返回另一個類型(通常爲值類型),該類型具有 GetAwaiter 方法,可儘可能減少性能關鍵代碼段中的內存分配。
測試代碼1
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
YBCL();
MessageBox.Show($"看看什麼時候執行!");
}
private async void YBCL()
{
//await ybTest();
Task t1 = Task.Factory.StartNew(() => { Thread.Sleep(10000); MessageBox.Show($"任務進行中!"); });
MessageBox.Show($"任務已完成!");
}
public Task ybTest()
{
Task t1 = Task.Factory.StartNew(() => { Thread.Sleep(1000); });
return t1;
}
彈窗的先後順序爲
已完成->進行中->(點擊“已完成”確定後)看看什麼時候執行
也就是說,Task相當於開了一個線程,而後直接執行下一步的操作,點擊完成後,又返回到最初的ButtonBase_OnClick函數去執行“看看什麼時候執行”函數。線程結束後,自動彈出“任務進行中”。
測試代碼1
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
YBCL();
MessageBox.Show($"看看什麼時候執行!");
}
//此處用await關鍵字
private async void YBCL()
{
await ybTest();
MessageBox.Show($"任務已完成!");
}
public Task ybTest()
{
Task t1 = Task.Factory.StartNew(() => { Thread.Sleep(1000);MessageBox.Show($"任務進行中!");});
return t1;
}
彈窗的先後順序爲
看看什麼時候執行->進行中->(點擊“進行中”確定後)已完成
也就是說,事件觸發後,調用了異步函數YBCL(),然後不等這個函數響應,直接跳過了整個函數。而在YBCL()中,await的作用是等待ybTest()函數運算完,纔開始運算下面的函數。即:await下面的函數,需要等待await 的對象 完成後 才能繼續運行。
而async函數外部的代碼,則是與函數內部的代碼分開了。