怎样写一个异步方法

本文详细介绍了C#中的异步编程,包括使用Task、Task和ValueTask的不同场景,async关键字的使用,await表达式的运用,以及CancellationToken的中断机制。展示了如何在WebClient操作和自定义异步方法中使用这些概念。
摘要由CSDN通过智能技术生成

1.定义一个异步对象,这个对象有三种类型Task、Task<T>和ValueTask<T>,调用一个异步方法,把返回值赋值给异步对象。
如果这个异步方法需要有返回值,那么这个对象的类型写Task<T>或ValueTask<T>,
如果仅需要一些状态,那么写Task,
如果什么都不需要,那么不用赋值,直接调用。
例如:

Task<int> sometask=ReturnSomeInt();

返回值包含在sometask.Result

2.写这个异步方法,加上关键字async,并相对定义函数的返回类型,无返回类型的写void
例如:

class A
{
     public static async Task<int> ReturnSomeInt()
     {    }
}

3.写这个异步方法中的await表达式,表达式返回一个Task或ValueTask类型的对象(其实是一个awaitable类型的对象,但Task类和ValueTask类也是awaitable类)。
C#的BCL中定义了许多能够返回Task类型的方法,只要直接把这些方法放到await后面就可以
例如:

WebClient wc1 = new WebClient();
string result=await wc1.DownloadStringTaskAsync(new Uri("www.baidu.com"));

4.也可以写自己的异步方法,只要把自己写的方法传递给一个委托,这个委托是Task.Run()的形参。
形参可以采用不同的委托,然后Task.Run()也会产生不同的返回值。
当然也可以直接传递匿名类型或Lamda表达式,相当于常量。

委托类型可以赋值给该委托类型的方法
Actionvoid Dosome()
Func<int>int Dosome()
Func<Task>Task Dosome()
Func<Task<int>>Task<int> Dosome()

后两种因为直接返回了Task类型,所以可以按照3. 直接写在await后面,其实也没有必要采用Task.Run()了。
委托所接受的方法都是无参数的,如果要异步运行有参数的方法,就直接在Dosome()中调用这个方法即可。

5.异步方法可以在同步过程中中断。

 CancellationTokenSource a = new CancellationTokenSource();
 CancellationToken atoken1 = a.Token;
 CancellationToken atoken2 = a.Token;
 CancellationTokenSource b = new CancellationTokenSource();
 CancellationToken btoken = b.Token;
 Task t1 = RunAsync(atoken1); //把CancellationToken对象传递给异步函数
 Task t2 = RunAsync(atoken1);
 Task t3 = RunAsync(btoken);
 a.Cancel();//中断任务t1、t2
 b.Cancel();//中断任务t3
 ……
 public  RunAsync(CancellationToken ct)//异步函数增加一个CancellationToke类型的形参
 { 
   await Task.Run(()=>Dosome(ct),ct);//在Task.Run()方法中增加一个CancellationToke类型的参数即可
 }

执行了a.Cancel()后,会把ct.IsCancellationRequested置为0,只要在异步方法中时时检查这个值是否为0,是就return即可

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值