zoukankan      html  css  js  c++  java
  • 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}");
            }
        }
    }

    <执行结果>

    [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.)有返回值的情况(异步也是基于线程).

    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,线程:1

  • 相关阅读:
    官方源、镜像源汇总
    Kubernetes V1.15 二进制部署集群
    ZABBIX 4.0 LTS 部署
    SSH + Google Authenticator 安全加固
    Hadoop+HBase 集群搭建
    自动化运维之PSSH
    KVM之CPU虚拟化
    GoAccess日志分析工具
    HTTPS之acme.sh申请证书
    AWStats日志分析系统
  • 原文地址:https://www.cnblogs.com/taohuadaozhu/p/13538884.html
Copyright © 2011-2022 走看看