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;
}
}
}