Task Await Async

Task 虽然出来好久好久了。但是我个人感觉最近两年才走向巅峰(可能是我都呆小公司的原因)之前只是牛逼的组件和插件或者微软demo里才有这种写法,到了现在都已经平民化了,不写个async / Task都感觉low到爆了。

public static async Task Test(){
	await Task.Run(() =>{ Console.WriteLine(""); });
}

C#5.0新增了async和await关键字
使用这两个关键字可以大大简化异步编程,使用 async 关键字可将方法、lambda 表达式或匿名方法标记为异步,即,方法中应该包含一个或多个await表达式,但async关键字本身不会创建异步操作。
定义异步方法的几点要求

  • 使用async关键字来修饰方法
  • 在异步方法中使用await关键字(不使用编译器会给出警告但不报错),否则异步方法会以同步方式执行
  • 尽量不使用void作为返回类型,若希望异步方法返回void类型,请使用Task
  • 异步方法名称以Async结尾
  • 异步方法中不能声明使用ref或out关键字修饰的变量

如:

async Task<int> DoSomethingAsync()
{
    HttpClient client = new HttpClient();
    var str = await client.GetResultAsync("https://www.visualstudio.com/");
    return str.Length;
}

在遇到awiat关键字之前,程序是按照代码顺序自上而下以同步方式执行的。
在遇到await关键字之后,系统做了以下工作:

  • 异步方法将被挂起
  • 将控制权返回给调用者
  • 使用线程池中的线程(而非额外创建新的线程)来计算await表达式的结果,所以await不会造成程序的阻塞
  • 完成对await表达式的计算之后,若await表达式后面还有代码则由执行await表达式的线程(不是调用方所在的线程)继续执行这些代码
    我们可以得知异步是借助于多线程来实现的。

Thread
Framework1.0出的线程Thread,线程是前面所说的异步(async/await)和任务(Task)的基础。和线程紧密相关的另外一个概念是进程,这里不多赘述。
ThreadPool
Framework2.0出的线程池ThreadPool,线程也是对象,频繁的创建和销毁线程比较影响性能,.NET提供线程池使得我们能够复用线程对象从而避免频繁创建和销毁线程。
Task
Task类拥有执行异步方法的两个方法:Task.Run(),Task.Run,Task.Run以及Task.Run使用线程池中的线程来执行代码,它和使用await关键字的区别是:Task.Run直接使用线程池中的线程,而使用await的异步方法是在遇到await关键字后才使用多线程,这里的多线程还是使用的线程池。

.Net多线程编程—System.Threading.Tasks.Parallel
1 Parallel.Invoke
尽可能并行执行所提供的每个操作,除非用户取消了操作。
2 Parallel.For
可能会并行运行迭代,可以监视和操作循环的状态。Parallel.For有多个重载的方法,下面列举部分方法。

结语
自己创建线程比较麻烦但能够更好的控制程序的运行,使用async/await关键字来编码显得较为简洁,但对程序的控制力度会有所降低。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值