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 Task<int> DoSomethingAsync()
{
HttpClient client = new HttpClient();
var str = await client.GetResultAsync("https://www.visualstudio.com/");
return str.Length;
}
在遇到awiat关键字之前,程序是按照代码顺序自上而下以同步方式执行的。
在遇到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关键字来编码显得较为简洁,但对程序的控制力度会有所降低。