Async Await 多執行緒等待 應用
阿新 • • 發佈:2021-12-06
不同框架的應用
///1.Winform--存在特殊處理
///2.ASP.NETCore---放心用
///3.控制檯---放心用
///4.WPF----沒試過---
///5.Core WebApi---放心用
Winform
/// <summary> ///非同步方法: 正常執行 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private async void btnAsync_Click(object sender, EventArgs e) { Debug.WriteLine($"**********************************btnAsync_Click******************************************"); Debug.WriteLine($"This is btnAsync_Click Start,ThreadId={Thread.CurrentThread.ManagedThreadId}"); long lResult = await this.CalculationAsync(1_000_000); Debug.WriteLine($"This is btnAsync_Click End,ThreadId={Thread.CurrentThread.ManagedThreadId}"); this.textAsyncResult.Text = lResult.ToString(); //這句話必須要主執行緒來執行的 //更改控制元件的值,這裡必須是(UI執行緒)主執行緒去執行;每次執行都能成功,說明每次這裡都是主執行緒來執行的;跟Winform設計有關係;在Winform中,await後面的內容,都會讓主執行緒來執行; } private async Task<long> CalculationAsync(long total) { var task = await Task.Run(() => { Debug.WriteLine($"This is CalculationAsync Start,ThreadId={Thread.CurrentThread.ManagedThreadId}"); long lResult = 0; for (int i = 0; i < total; i++) { lResult += i; } Debug.WriteLine($"This is CalculationAsync End,ThreadId={Thread.CurrentThread.ManagedThreadId}"); return lResult; }); return task; //這句話必須由主執行緒來執行,執行緒在同一時刻只能做一件事兒 }
/// <summary> /// 同步方法:介面卡死了 新加一個執行緒變成三個執行緒等待 就不會死鎖了 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnSync_Click(object sender, EventArgs e) { Debug.WriteLine($"**********************************btnSync_Click******************************************"); Debug.WriteLine($"This is btnSync_Click Start,ThreadId={Thread.CurrentThread.ManagedThreadId}"); //var task = this.CalculationAsync(1_000_000); ////task.Wait(); //主執行緒阻塞等待 ////1.主執行緒要等待 Winform特殊設計:await後面的內容必須由主執行緒執行; ////2.主執行緒在這兒也等待著在 ////3.主執行緒無暇分身導致死鎖 ////4.怎麼解決這個死鎖? //long lResult = task.Result;//主執行緒阻塞等待,主執行緒在等結果,經過分析可以確定,介面卡死問題肯定是出在這兒 long lResult = this.GetCalculationAsync(1_000_000); Debug.WriteLine($"This is btnSync_Click End,ThreadId={Thread.CurrentThread.ManagedThreadId}"); this.textSync.Text = lResult.ToString(); } private long GetCalculationAsync(long total) { var taskLong = Task.Run(() => { //新開一個執行緒 var task = this.CalculationAsync(total); long lResult = task.Result;//子執行緒 return lResult; }); return taskLong.Result;//主執行緒在等Result }
private void btnSync_Click(object sender, EventArgs e) { Debug.WriteLine($"**********************************btnSync_Click******************************************"); Debug.WriteLine($"This is btnSync_Click Start,ThreadId={Thread.CurrentThread.ManagedThreadId}"); var task = this.CalculationAsync(1_000_000); //task.Wait(); //主執行緒阻塞等待 ////1.主執行緒要等待 Winform特殊設計:await後面的內容必須由主執行緒執行; ////2.主執行緒在這兒也等待著在 ////3.主執行緒無暇分身導致死鎖 ////4.怎麼解決這個死鎖? long lResult = task.Result;//主執行緒阻塞等待,主執行緒在等結果,經過分析可以確定,介面卡死問題肯定是出在這兒 ------等待---相互等待鎖死 // long lResult = this.GetCalculationAsync(1_000_000); windform 中await後面必須由主執行緒完成 Debug.WriteLine($"This is btnSync_Click End,ThreadId={Thread.CurrentThread.ManagedThreadId}"); this.textSync.Text = lResult.ToString(); } private async Task<long> CalculationAsync(long total) { var task = await Task.Run(() => { Debug.WriteLine($"This is CalculationAsync Start,ThreadId={Thread.CurrentThread.ManagedThreadId}"); long lResult = 0; for (int i = 0; i < total; i++) { lResult += i; } Debug.WriteLine($"This is CalculationAsync End,ThreadId={Thread.CurrentThread.ManagedThreadId}"); return lResult; }); return task; //這句話必須由主執行緒來執行,執行緒在同一時刻只能做一件事兒 -----(主執行緒在等待)---- }