Lambda 表达式
是一个可用于创建委托或表达式树类型的匿名函数
不需要函数名,直接(输入参数列表)=>{语句块}
委托
委托是调用方法的一种机制,是一种引用类型,用于封装命名方法及匿名方法
//定义委托
public delegate void MyDelegate1();//无参数的委托,无返回值
public delegate int MyDelegate2(string name);//最多有一个参数
//实例化委托
委托名 委托实例名 = 调用的方法名//此处也可以使用匿名方法
//访问需要调用的方法
委托实例名();
Action委托 和 Func 委托
Action委托没有返回值,Func 委托有返回值,其余相同
Func 委托的返回值类型放置在参数列表的最后
Action<[T1,T2,……,T16]>
Func<[T1,T2,……,T16,]TResult>
class Program
{
static void Main(string[] args)
{
//Action委托已经被系统定义
Action<string> a =ShowMessage;//实例化Action委托
a("OK");//调用ShowMessage方法
Console.ReadKey();
}
private static void ShowMessage(string message)
{
Console.WriteLine(message);
}
}
创建异步执行任务
创建方法
public async Task Method()
{
await Task.Delay(100);//在另一个辅助线程中休眠500毫秒
}
public async Task Method1()//这是一个无返回值的异步方法,由async和task共同签名
{
//第一种方式
Task task = Method();//创建并调用一个异步方法,返回值为Task类型,此处开始进行异步操作,此时隐式地创建了一个Task,Task是实现异步编程的一种方式
//一些另外的,在异步操作进行时执行的代码
await task;//此时等待上面的异步方法执行完毕
//await运算符
//表示等待异步执行的结果
//实质上对方法的返回值进行操作
//不会执行后面的代码
//只能出现在异步方法中
//异步方法内部必须有一个await关键字
Task<String> task1 =Method2();//返回值为Task<String>类型,此处开始进行异步操作
//一些另外的,在异步操作进行时执行的代码
String s = await task1;//此处等待异步方法执行完毕并回收此任务的返回值
//第二种方式
Task task = new Task(Method);//创建任务,此时执行的函数也可以是同步方法
task.Start()//启动任务,创建辅助线程
//第三种方式
Task.Run(Method);//使用Task.Run方法隐式地创建和执行任务
int sum= await Task.Run(Method);//此处等待异步方法执行完毕并回收此任务的返回值
}
public async Task<String> Method2(string s)//这是一个有返回值的异步方法,由async和task<T>共同签名
{
await Task.Delay(100);
return s;
}
取消任务
为了防止任务陷入死循环或死锁,有时需要打断任务的完成
CancellationTokenSource cts= new CancellationTokenSource();//创建取消源对象
Task a = Method("a",cts.Token)//创建任务时就传入一个cts.Token取消令牌,方便之后的取消任务操作
cts.Cancel();//发出取消通知
private async Task Method(string s,CancellationToken ct)//取消令牌的类型为CancellationToken
{
bool b =ct.IsCancellationRequested;//接收取消通知
}