异步执行 | Personal Blog

异步执行

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;//接收取消通知
}