朝阳市网站公司,营销管理培训课程培训班,嘉兴营销型网站建设,创建软件网站先总结一下 之前发展过程的要点 1#xff1a; 为了保证多线程正确顺序执行 线程同步 2#xff1a; 为了节省操作系统线程资源 线程池 异步 方式管理
正常来讲 使用这俩个要点 进行使用 多线程可以满足开发使用需求 但是 新的问题产生了 那就是 多个异步操作 需要编写大量的代…先总结一下 之前发展过程的要点 1 为了保证多线程正确顺序执行 线程同步 2 为了节省操作系统线程资源 线程池 异步 方式管理
正常来讲 使用这俩个要点 进行使用 多线程可以满足开发使用需求 但是 新的问题产生了 那就是 多个异步操作 需要编写大量的代码 控制线程同步以及异步结果处理逻辑 为了 解决这种情况 Task 来了
Task 也就是 TPL 任务并行库 其实可以理解为 对这个 线程池异步方式一个更抽象的表达 一种隐藏细节的封装以任务的方式来 替代 异步操作线程之间的交互并且提供相应的api去使用
而大多数情况 对于程序开发而言 对于 线程异步处理具体实现是不需要关注的关注的是业务的执行逻辑也就是说 Task的目的很明确 封装底层实现 让程序员更关注业务逻辑层只需要合理使用Task的方式 确保逻辑上的正确即可而不是专注在异步操作线程大量代码中
接下来 就是主要讲如何使用Task 的 api
创建任务 不再是thread类的方式了 有专门的Task类 有3种创建 task.run( \task.factory.startnew()\new task().start() 正常来讲这种方式创建的线程 都是 属于 线程池 后台线程 如果有 长时间操作的 也可以通过 Task.Factory.StartNew(() TaskMethod(“长时间复杂操作单独线程”), TaskCreationOptions.LongRunning); 来设置 单独一个线程 也可以 task.RunSynchronously();阻塞线程 之前通过 join 或者 锁 信号量等 来线程同步 主线程或者子线程之间 task 的话 可以通过 task.result 来 代替join组合任务 task.ContinueWith 设置执行完之后执行操作 4.子线程中在创建子线程 必须在 运行时 就先创建 子线程并附加给 父子线程 5.取消任务 还是老方法 CancellationTokenSource cancle 然后 根据token.IsCancellationRequested 去判断 值得注意的是 如果在 task start之前就有可能存在取消操作 所以需要 var Task new Task(() TaskMethod(“Task”, cts.Token), cts.Token); 底层任务传递一次取消标志,然后给任务构造函数再传递一次 那么在取消之后进行start 就会拦住报错 异常 不会进行执行去影响