Thread线程和ThreadPool线程池
Thread:我们可以开启一个线程。但是请大家记住:线程开启会在空间和时间上有不小的开销。所以,不能随便开。
ThreadPool:会根据你的CPU的核心数开启一个最合适的线程数量。如果你操作中,非常耗时,就不要用线程池,如果耗时十几分钟,那就不合适线程池了。
Task=>Thread + ThreadPool结合 ,使用多线程,尽量使用Task
1 |
|
2,Task中的跨线程访问控件和UI耗时任务卡顿的解决方法

1 | //普通方法 |
1、Task的优势
ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便。比如:
◆ ThreadPool不支持线程的取消、完成、失败通知等交互性操作;
◆ ThreadPool不支持线程执行的先后次序;
以往,如果开发者要实现上述功能,需要完成很多额外的工作,现在,FCL中提供了一个功能更强大的概念:Task。Task在线程池的基础上进行了优化,并提供了更多的API。在FCL4.0中,如果我们要编写多线程程序,Task显然已经优于传统的方式。
以下是一个简单的任务示例:
1 | using System; |
2、Task的用法
2.1、创建任务
无返回值的方式
方式1:
var t1 = new Task(() => TaskMethod("Task 1"));
t1.Start();
1 | 注: |
1 |
|
async/await的实现方式:
1 | using System; |
带返回值的方式
方式4:
Task
task.Start();
int result = task.Result;
1 | using System; |
2.2、组合任务.ContinueWith
简单Demo:
1 | using System; |
任务的串行:
1 | using System; |
子任务:
1 | using System; |
动态并行(TaskCreationOptions.AttachedToParent) 父任务等待所有子任务完成后 整个任务才算完成
1 | using System; |
2.3、取消任务 CancellationTokenSource
1 | using System; |
2.4、处理任务中的异常
单个任务:
1 | using System; |
1 | using System; |
多个任务:
1 | using System; |
2.5、Task.FromResult的应用
1 | using System; |
2.6、使用IProgress实现异步编程的进程通知
IProgress
1 | using System; |
2.7、Factory.FromAsync的应用 (简APM模式(委托)转换为任务)(BeginXXX和EndXXX)
带回调方式的
1 | using System; |
不带回调方式的
1 | using System; |