1. 程式人生 > 其它 >Async Await 多執行緒等待 應用

Async Await 多執行緒等待 應用

不同框架的應用
///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; //這句話必須由主執行緒來執行,執行緒在同一時刻只能做一件事兒   -----(主執行緒在等待)----
        }