.NET 多线程 (Thread,ThreadPool,Task,Async 与 Await)
进程与线程
进程是一种正在执行的程序。
线程是程序中的一个执行流。
多线程是指一个程序中可以同时运行多个不同的线程来执行不同的任务。
.NET中的线程
Thread是创建和控制线程的类。
ManagedThreadId是线程ID。
CurrentThread是获取当前正在运行的线程。
同步与异步
同步是调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。(单线程)
异步调用一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作。(多线程)
.NET中的多线程发展
主要有Thread,ThreadPool,Task
Thread就是线程,需要自己调度,直接跟系统对接,相对管理比较复杂及效率差。
ThreadPool是Thread的一个升级版,ThreadPool是从线程池中获取线程,如果线程池中又空闲的元素,则直接调用,如果没有才会创建,而Thread则是会一直创建新的线程,要知道开启一个线程就算什么事都不做也会消耗大约1m的内存,是非常浪费性能的。但是ThreadPool提供的接口比较少。
Task和ThreadPool是一样的,都是从线程池中取空闲的线程。比ThreadPool调用接口更加丰富。目前.Net使用多线程管理,应该优先使用Task。
代码:
为什么需要多线程?
特点:
卡界面:单线程卡,多线程不卡
性能好:单线程差,多线程好(资源换性能)
执行顺序:单线程顺序,多线程无序
代码:
如何使用.NET多线程?
Task
创建任务
1、通过调用任务类构造函数实例化,但通过调用其Start()启动任务。
2、通过调用TaskFactory.StartNew(Action <Object>,Object)方法在单个方法调用中实例化和启动任务。
3、通过调用Run(Action)方法在单个方法调用中实例化和启动任务。
从任务中返回值
Result 属性将阻止调用线程,直到任务完成。
等待任务完成
可以通过调用 Wait 方法来等待一个或多个任务完成,从而同步调用线程的执行以及它启动的异步任务。
调用无参数 Wait() 方法以无条件等待,直到任务完成。
调用Wait(Int32)和 Wait(TimeSpan) 方法会阻止调用线程,直到任务完成或超时间隔(以先达到者为准)为止。
调用WaitAny(Task[])方法等待一组任务中第一个任务完成。
调用WaitAll(Task[])方法来等待一系列任务全部完成。
异常处理
调用代码可以通过使用 try/catch 块中的以下任意方法来处理异常:
await task
task.Wait()
task.Result
task.GetAwaiter().GetResult()
代码:
取消任务
你可以使用 CancellationTokenSource 类在以后某一时间发出取消请求。
实际案例
代码:
async和await
Async 和 Await几乎与创建同步方法一样创建异步方法。
代码:
参考
使用 Async 和 Await 的异步编程 https://docs.microsoft.com/zh-CN/dotnet/csharp/programming-guide/concepts/async/
版权声明: 本文为 InfoQ 作者【AI代笔】的原创文章。
原文链接:【http://xie.infoq.cn/article/48deb97e2adf758702cc31233】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论