c#5.0(.net 4.5以後)的 Async+await+Task的異步機制的調試筆記

1.)無返回值的狀況(異步也是基於線程).異步

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ConfigLab.Test.BLL.AsyncTaskSpace
{
    /// <summary>
    /// 功能簡介:測試無返回值,無需等待的async+await+task的異步處理機制。
    /// 建立時間:2020-8-21
    /// 建立人:pcw
    /// 博客:http://cnblogs.com/taohuadaozhu
    /// </summary>
    public  class Test1_Async_NotWait
    {
        public static void StartTest()
        {
            Utils.SaveLog($"Test1_Async_NotWait.StartTest.開始..{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")},線程:{Thread.CurrentThread.ManagedThreadId}");
            AsyncTestMethod();
            Utils.SaveLog($"Test1_Async_NotWait.StartTest.結束..{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")},線程:{Thread.CurrentThread.ManagedThreadId}");
        }
        /// <summary>
        /// 異步方法
        /// </summary>
        /// <returns></returns>
        static async Task AsyncTestMethod()
        {
            /*
             注1:使用await表達式時,方法到這裏以前先返回,等控制返回到調用此方法的線程中後,控制會自動返回到await關聯語句下面的語句中。發生異常時,異常會在await表達式中拋出
             注2:  使用Task.Run方式執行異步時,會在獨立的線程中執行異步任務。
             */
            Utils.SaveLog($"Test1_Async_NotWait.AsyncTestMethod.begin: await Task.Run,線程:{Thread.CurrentThread.ManagedThreadId}");
            await Task.Run(() => {
                for (int i = 0; i < 5; i++)
                {
                    Thread.Sleep(200);
                    Utils.SaveLog($"Test1_Async_NotWait.AsyncTestMethod:{i},{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")},線程:{Thread.CurrentThread.ManagedThreadId}");
                }
            });
            Utils.SaveLog($"Test1_Async_NotWait.AsyncTestMethod.after: await Task.Run,線程:{Thread.CurrentThread.ManagedThreadId}");
        }
    }
}

 

<執行結果>async

[2020-08-21 00:41:33]Test1_Async_NotWait.StartTest.開始..2020-08-21 00:41:33 742,線程:1
[2020-08-21 00:41:33]Test1_Async_NotWait.AsyncTestMethod.begin: await Task.Run,線程:1
[2020-08-21 00:41:33]Test1_Async_NotWait.StartTest.結束..2020-08-21 00:41:33 815,線程:1
[2020-08-21 00:41:34]Test1_Async_NotWait.AsyncTestMethod:0,2020-08-21 00:41:34 017,線程:3
[2020-08-21 00:41:34]Test1_Async_NotWait.AsyncTestMethod:1,2020-08-21 00:41:34 219,線程:3
[2020-08-21 00:41:34]Test1_Async_NotWait.AsyncTestMethod:2,2020-08-21 00:41:34 422,線程:3
[2020-08-21 00:41:34]Test1_Async_NotWait.AsyncTestMethod:3,2020-08-21 00:41:34 624,線程:3
[2020-08-21 00:41:34]Test1_Async_NotWait.AsyncTestMethod:4,2020-08-21 00:41:34 827,線程:3
[2020-08-21 00:41:34]Test1_Async_NotWait.AsyncTestMethod.after: await Task.Run,線程:1測試

 

2.)有返回值的狀況(異步也是基於線程).spa

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ConfigLab.Test.BLL.AsyncTaskSpace
{
    /// <summary>
    /// 功能簡介:測試有返回值,無需等待的async+await+task的異步處理機制。
    /// 建立時間:2020-8-21
    /// 建立人:pcw
    /// 博客:http://cnblogs.com/taohuadaozhu
    /// </summary>
    public class Test3_Async_TaskWithReturn
    {
        public static  void StartTest()
        {
            Utils.SaveLog($"Test3_Async_TaskWithReturn.StartTest.開始..{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")},線程:{Thread.CurrentThread.ManagedThreadId}");
            getTestMethodReturnValue();
            Utils.SaveLog($"Test3_Async_TaskWithReturn.StartTest.結束..{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")}");
        }
        static async void getTestMethodReturnValue()
        {
            Utils.SaveLog($"Test3_Async_TaskWithReturn.getTestMethodReturnValue.開始..{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")},線程:{Thread.CurrentThread.ManagedThreadId}");
            var taskResult= AsyncTestMethod();
            await taskResult;
            //Utils.SaveLog($"Test3_Async_TaskWithReturn.StartTest.結束..{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")},異步任務返回結果:{(task.Status!=TaskStatus.WaitingForActivation? task.Result:"")}");
            Utils.SaveLog($"Test3_Async_TaskWithReturn.getTestMethodReturnValue.結束..{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")},異步任務返回結果:{taskResult.Result},線程:{Thread.CurrentThread.ManagedThreadId}");
        }

        /// <summary>
        /// 異步方法
        /// </summary>
        /// <returns></returns>
        static async Task<string> AsyncTestMethod()
        {
            /*
             注1:使用await表達式時,控制會返回到調用此方法的線程中;在await等待的方法執行完畢後,控制會自動返回到下面的語句中。發生異常時,異常會在await表達式中拋出
             注2:  使用Task.Run方式執行異步時,會在獨立的線程中執行異步任務。
             */
            Utils.SaveLog($"Test3_Async_TaskWithReturn.AsyncTestMethod..(await Task.Run以前),線程:{Thread.CurrentThread.ManagedThreadId}");
            return await Task.Run(() => {
                Thread.Sleep(2000);
                Utils.SaveLog($"Test3_Async_TaskWithReturn.AsyncTestMethod(task.Run之中),{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")},線程:{Thread.CurrentThread.ManagedThreadId}");
                return "success";
             });
        }
    }
}

<執行結果>線程

[2020-08-21 00:41:35]Test3_Async_TaskWithReturn.StartTest.開始..2020-08-21 00:41:35 821,線程:1
[2020-08-21 00:41:35]Test3_Async_TaskWithReturn.getTestMethodReturnValue.開始..2020-08-21 00:41:35 824,線程:1
[2020-08-21 00:41:35]Test3_Async_TaskWithReturn.AsyncTestMethod..(await Task.Run以前),線程:1
[2020-08-21 00:41:35]Test3_Async_TaskWithReturn.StartTest.結束..2020-08-21 00:41:35 829
[2020-08-21 00:41:37]Test3_Async_TaskWithReturn.AsyncTestMethod(task.Run之中),2020-08-21 00:41:37 830,線程:3
[2020-08-21 00:41:37]Test3_Async_TaskWithReturn.getTestMethodReturnValue.結束..2020-08-21 00:41:37 834,異步任務返回結果:success,線程:1code

相關文章
相關標籤/搜索