.NET-Demo for async and await

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

namespace MyQuartz
{
    class Program
    {
        static void Main(string[] args)
        {
            var asynctest = new MyClass();
            //asynctest.Init();
            asynctest.InitAsync();
        }
    }

    /// <summary>
    /// Demo of using for async and await 
    /// </summary>
    public class MyClass
    {
        public void Init()
        {
            DisplayValue(); //这里会阻塞  
            Console.WriteLine("MyClass() End.");
            Console.ReadLine();
        }
        public void InitAsync()
        {
            DisplayValueAsync(); //这里不会阻塞  
            Console.WriteLine("MyClass() End.");
            Console.ReadLine();
        }

        private Task<double> GetValueAsync(double num1, double num2)
        {
            return Task.Run(() =>
            {
                for (int i = 0; i < 100000000; i++)
                {
                    num1 = num1 / num2;
                }
                return num1;
            });
        }

        private double GetValue(double num1, double num2)
        {
            for (int i = 0; i < 1000000000; i++)
            {
                num1 = num1 / num2;
            }
            return num1;
        }

        private async void DisplayValueAsync()
        {
        //此处会开新线程处理GetValueAsync任务,然后方法马上返回  
            double result = await GetValueAsync(1234.5, 1.01);
        //这之后的所有代码都会被封装成委托,在GetValueAsync任务完成时调用                                                        
            Console.WriteLine("Value is : " + result);
        }

        private void DisplayValue()
        {
            double result = GetValue(1234.5, 1.01);                                                            
            Console.WriteLine("Value is : " + result);
        }
    }


}

DisplayValue()方法里await GetValueAsync()之后的所有代码都会在异步任务完成时才会执行。
DisplayValue()方法实际执行的代码如下:

public void DisplayValue()  
{  
    System.Runtime.CompilerServices.TaskAwaiter<double> awaiter = GetValueAsync(1234.5, 1.01).GetAwaiter();  
    awaiter.OnCompleted(() =>  
        {  
            double result = awaiter.GetResult();  
            System.Diagnostics.Debug.WriteLine("Value is : " + result);  
        });  
}   

参考博客:
http://blog.csdn.net/tianmuxia/article/details/17675681

Async and callback

    public static class TaskAsyncHelper
    {
        /// <summary>  
        /// 将一个方法function异步运行,在执行完毕时执行回调callback  
        /// </summary>  
        /// <param name="function">异步方法,该方法没有参数,返回类型必须是void</param>  
        /// <param name="callback">异步方法执行完毕时执行的回调方法,该方法没有参数,返回类型必须是void</param>  
        public static async void RunAsync(Action function, Action callback)
        {
            Func<Task> taskFunc = () =>
                {
                    return Task.Run(() =>
                    {
                        function();
                    });
                };
            await taskFunc();
            if (callback != null)
                callback();
        }

        /// <summary>  
        /// 将一个方法function异步运行,在执行完毕时执行回调callback  
        /// </summary>  
        /// <typeparam name="TResult">异步方法的返回类型</typeparam>  
        /// <param name="function">异步方法,该方法没有参数,返回类型必须是TResult</param>  
        /// <param name="callback">异步方法执行完毕时执行的回调方法,该方法参数为TResult,返回类型必须是void</param>  
        public static async void RunAsync<TResult>(Func<TResult> function, Action<TResult> callback)
        {
            Func<Task<TResult>> taskFunc =() =>               
            {
                return Task.Run(() =>
                {
                    return function();
                });
            };
            TResult rlt = await taskFunc();
            if (callback != null)
                callback(rlt);
        }
    }

    public class TaskAsyncMethod
    {
        public static double ComputeMil()
        {
            double j = 1;
            for (int i = 0; i < 1e7; i++)
                j /= 1.01;
            return j;
        }

        public static void printVal(double j)
        {
            Console.WriteLine(string.Format("finished, j={0}", j));
        }

    }

应用:

            TaskAsyncHelper.RunAsync<double>(TaskAsyncMethod.ComputeMil, TaskAsyncMethod.printVal);
            Console.WriteLine("This is an async method:\n " +
                "Async calculation completion,\n" +
                " next, exec callback to print the value. ");
            Console.ReadLine();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值