.net 4.0环境异步方法实现,异步委托和回调异常处理

.net 4.0环境异步方法实现,异步委托和回调异常处理

  1. 无返回值的异步方法通过委托实现
        static void Main(string[] args)
        {
            //异步执行写入数据任务,不阻塞主线程任务
            SetDataAsync(1);
            Console.WriteLine("主线程后续任务...");
            Console.ReadKey();
        }  

        public static void SetDataAsync(int num)
        {
            //这里需要的是一个无返回值,int类型参数的委托
            Action<int> func = SetData;
            func.BeginInvoke(num, null, null);
        }

        private static void SetData(int num)
        {  
            System.Threading.Thread.Sleep(3000);//模拟shang耗时时间
            num++; //模拟处理传入参数(实际应用可以是写入文件,写入数据库...)
            Console.WriteLine("写入数据任务处理完毕,num:" + num);
        }

2.有返回值的异步方法通过委托实现,我们需要拿到返回值之后进一步做一下事情(回调函数),但不阻塞主线程

        static void Main(string[] args)
        {
            //异步执行查询数据任务,希望把查询到的数据加上当前时间,但不阻塞主线程任务
            GetDataAsync(1, ar =>
            {
                //将IAysncResult转换为我们定义的委托类型
                Func<int, string> func = (Func<int, string>)((AsyncResult)ar).AsyncDelegate;
                //使用EndInvoke获取委托执行结果
                var data = func.EndInvoke(ar);
                //对返回结果进一步计算(加上当前时间)
                Console.WriteLine(data + DateTime.Now.ToLongDateString());
            });
            Console.WriteLine("主线程后续任务...");
            Console.ReadKey();
        } 
        public static void GetDataAsync(int num, Action<IAsyncResult> action)
        {
            //这里需要的是一个string返回类型,int传入参数的委托
            Func<int, string> func = GetData; 
            func.BeginInvoke(num, new AsyncCallback(action), null);
        } 
        private static string GetData(int num)
        {
            System.Threading.Thread.Sleep(3000);//模拟查询耗时时间 
            return "data_" + num;
        }
  1. 回调函数发生异常,封装异常捕获。异步委托我们是无法在主线程里捕获子线程的异常,只能在具体的回调函数里写try catch。这样会出现大量的try catch。回调异常的优雅封装
         static void Main(string[] args)
        {
            //异步执行查询数据任务,希望把查询到的数据加上当前时间,但不阻塞主线程任务
            GetDataAsync(1, ar =>
            {
                //将IAysncResult转换为我们定义的委托类型
                Func<int, string> func = (Func<int, string>)((AsyncResult)ar).AsyncDelegate;
                //使用EndInvoke获取委托执行结果
                var data = func.EndInvoke(ar);
                //对返回结果进一步计算(加上当前时间)
                Console.WriteLine(data + DateTime.Now.ToLongDateString());
                //封装了回调函数的异常,具体回调函数块就无须try catch也能捕获
                int a = int.Parse("a");
            });
            Console.WriteLine("主线程后续任务...");
            Console.ReadKey();
        } 
        public static void GetDataAsync(int num, Action<IAsyncResult> action)
        {
            //这里需要的是一个string返回类型,int传入参数的委托
            Func<int, string> func = GetData;
            AsyncCallback callback = ar =>
            {
                try
                {
                    action.Invoke(ar);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            };
            func.BeginInvoke(num, callback, null);
        } 
        private static string GetData(int num)
        {
            System.Threading.Thread.Sleep(3000);//模拟查询耗时时间 
            return "data_" + num;
        }

.net 4.0环境异步方法实现,异步委托和回调异常处理_第1张图片

你可能感兴趣的:(异步多线程,c#,asp.net)