C# 异步编程Async和Await

C# 异步编程Async和Await

特点:
1.方法头中包含Async方法修饰符;
2.包含一个或多个await表达式,表示可以异步完成的任务;
3.必须具备以下三种返回类型:void,Task,Task< T>;其中Task和Task< T>的返回对象表示将在未来完成的工作,调用方法和异步方法可以继续执行;
4.异步方法的参数可以为任意类型任意数量,但不能为out或ref参数;
5.按照约定,异步方法的名称应该以Async为后缀;
6.除了方法以外,Lambda表达式和匿名方法也可以作为异步对象;

结构如下:
在这里插入图片描述
返回类型:
Task< T>:如果调用方法要从调用中获取一个T类型的值,异步方法的返回类型就必须是Task< T>。调用方法将通过读取Task的Result属性来获取这个T类型的值。如下代码:

Task<int> value = DoStuff.CalculateSumAsync(5,6);
...
...
...
Console.WriteLine("Value : {0}",value.Result);

Task:如果调用方法不需要从异步方法中返回某个值,但需要检查异步方法的状态,那么异步方法可以返回一个Task类型的对象。这时,即使异步方法中出现了return语句,也不会返回任何东西。如下代码:

Task someTask = DoStuff.CalculateSumAsync(5,6);
...
...
...
someTask.Wait();

void:如果调用方法仅仅想执行异步方法,而不需要与它做任何进一步的交互时[这称为"调用并忘记"],异步方法可以返回void类型。这时,与上一种情况类似,即使异步方法中包含任何return语句,也不会返回任何东西。

下面举例说明这三种返回值类型:

//Task<T>
namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            Task<int> value = DoStartRun.CalculateAsync(8,9);
            //---处理其他事情...
            Console.WriteLine("Do other things");
            //------------------
            Console.WriteLine("value : {0}",value.Result);
            Console.ReadKey();
        }
    }
    static class DoStartRun
    {
        public static async Task<int> CalculateAsync(int num1,int num2)
        {
            int sum = await Task.Run(()=>GetSum(num1,num2));	//Task.Run()中的参数是Func委托类型
            return sum;
        }

        private static int GetSum(int num1,int num2)
        {
            Thread.Sleep(2000);
            return num1 + num2;
        }
    }
}
//Task
namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            Task someTask = DoStartRun.CalculateAsync(8,9);
            //---处理其他事情...
            Console.WriteLine("Do other things");
            //------------------
            someTask.Wait();
            Console.ReadKey();
        }
    }
    static class DoStartRun
    {
        public static async Task CalculateAsync(int num1,int num2)
        {
            int sum = await Task.Run(()=>GetSum(num1,num2));
            Console.WriteLine("Value : {0}",sum);
        }

        private static int GetSum(int num1,int num2)
        {
            Thread.Sleep(2000);
            return num1 + num2;
        }
    }
}
//void
namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            DoStartRun.CalculateAsync(8,9);
            //---处理其他事情...
            Console.WriteLine("Do other things");
            //------------------
            Thread.Sleep(4000);
            Console.WriteLine("Program Exiting!");
            Console.ReadKey();
        }
    }
    static class DoStartRun
    {
        public static async void CalculateAsync(int num1,int num2)
        {
            int sum = await Task.Run(()=>GetSum(num1,num2));
            Console.WriteLine("Value : {0}",sum);
        }

        private static int GetSum(int num1,int num2)
        {
            Thread.Sleep(2000);
            return num1 + num2;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值