当前位置: 首页 > news >正文

公司网站如何做二维码如何让网站做成移动版

公司网站如何做二维码,如何让网站做成移动版,wordpress4.9.5,wordpress 小工具插件下载地址前言我们在此前已经介绍了APM模型和EAP模型#xff0c;以及它们的优缺点。在EAP模型中#xff0c;可以实时得知异步操作的进度#xff0c;以及支持取消操作。但是组合多个异步操作仍需大量工作#xff0c;编写大量代码方可完成。因此#xff0c;在.Net Framework 4.0中以及它们的优缺点。在EAP模型中可以实时得知异步操作的进度以及支持取消操作。但是组合多个异步操作仍需大量工作编写大量代码方可完成。因此在.Net Framework 4.0中引入了一个新的关于异步操作的模型叫做任务并行库简称为TPL。第三个异步编程模型TPL概述TPL全称为Task Parallel Library它可以被认为是线程池之上的又一个抽象层隐藏了部分底层细节核心概念为任务。一个任务代表了一个异步操作该操作可以通过多种方式运行可以使用或者不使用独立线程(如Thread)运行还可以通过多种方式和其他任务组合起来。在本文中我们将探究TPL的使用方式以及如何正确处理异常取消任务如何使多个任务同时执行等。创建TPL我们首先需要创建一个控制台程序用来执行Task的创建和运行并在Task内部使用委托调用一个方法用来打印当前任务以及当前任务所在的线程信息如图所示我们分别使用了三种方式来创建任务并执行在第一种方式中使用new Task类的方式把需要执行的内容放入Action委托并传入参数最后使用Start方法开启任务执行若不调用Start方法则不会启动任务切记。在第二种方式和第三种方式中被创建的任务会立即开始工作所以无需显式调用Start方法。Task.Run与Task.Factory.StartNew的区别为前者是后者的一个快捷方式但后者拥有附加选项如没有特殊需求通常使用前者来创建任务。相关代码如下using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks;namespace TPLDemo {class Program{static void Main(string[] args){var t1 new Task(() TaskMethod(任务1));var t2 new Task(() TaskMethod(任务2));t1.Start();t2.Start();Task.Run(() TaskMethod(任务3));Task.Factory.StartNew(() TaskMethod(任务4));Task.Factory.StartNew(() TaskMethod(任务5), TaskCreationOptions.LongRunning);Thread.Sleep(TimeSpan.FromSeconds(1000));}/// summary/// 任务运行的方法/// /summary/// param namenameThe name./paramstatic void TaskMethod(string name){Console.WriteLine($Task {name} 是一个正在线程id为 {Thread.CurrentThread.ManagedThreadId} 上运行的任务是否为线程池线程{Thread.CurrentThread.IsThreadPoolThread});}} }接着我们来看一下运行结果如图所示可以看出任务1,2,3,4均为线程池中的线程也印证了我们此前的概念TPL为线程池上的一个抽象层。而任务5在实现时被我们标记为需要长时间运行的任务因此在调度时并未使用线程池中的线程而是单独开启一个线程执行这样可以避免线程池中的线程被长时间占用无法复用资源。实现取消在EAP模型中我们借助BackgroundWorker组件封装好的取消方法可以对正在执行的线程进行取消。那么这样的方式毕竟是有很大的局限性的因此在Net Framework 4.0中微软创建了统一的模型来协作取消涉及两个对象的异步操作或长时间运行的同步操作它就是CancellationTokenSource和CancellationToken。我们需要创建CancellationTokenSource实例以传入Task来标识此任务包含外部取消操作然后使用CancellationToken来传播任务内的应取消操作的通知如图所示相关代码如下using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks;namespace TPLDemo {class Program{static void Main(string[] args){var cts new CancellationTokenSource();var longTask new Taskint(() TaskMethod(任务1, 10, cts.Token), cts.Token);Console.WriteLine(longTask.Status);cts.Cancel();Console.WriteLine(longTask.Status);Console.WriteLine(任务1在执行前已经被取消);cts new CancellationTokenSource();longTask new Taskint(() TaskMethod(任务2, 10, cts.Token), cts.Token);longTask.Start();for (int i 0; i 5; i){Thread.Sleep(TimeSpan.FromSeconds(0.5));Console.WriteLine(longTask.Status);}cts.Cancel();for (int i 0; i 5; i){Thread.Sleep(TimeSpan.FromSeconds(0.5));Console.WriteLine(longTask.Status);}Console.WriteLine($任务2执行完成结果:{longTask.Result});Console.Read();}/// summary/// 任务取消的方法/// /summary/// param namename/param/// param nameseconds/param/// param nametoken/param/// returns/returnsprivate static int TaskMethod(string name, int seconds, CancellationToken token){Console.WriteLine($Task {name} 是一个正在线程id为 {Thread.CurrentThread.ManagedThreadId} 上运行的任务是否为线程池线程{Thread.CurrentThread.IsThreadPoolThread});for (int i 0; i seconds; i){Thread.Sleep(TimeSpan.FromSeconds(1));if (token.IsCancellationRequested){return -1;}}return 42 * seconds;}} }运行后结果如图所示从代码中我们可以看出我们给Task传递了两次CancellationTokenSource一次是任务内执行方法一次是任务本身构造函数那么为什么要这样做呢因为如果我们在任务启动之前进行取消那么该任务所在的TPL模型就会“接管”该取消操作因为这些代码根本不会继续执行。我们查看第一个任务的状态可以得知它已经被取消了如果在此时再调用Start方法那么将会抛出一个异常。而在第二个任务中我们先执行任务再做取消那么此时我们相当于是在外部对此任务进行取消控制而且在执行取消之后任务2的状态依然是RanToCompletion而不是Canceled。因为从TPL的角度来看该任务正常完成了它的工作所以我们在编写代码时需要辨别这两种情况同时理解它在两种情况下职责的不同。处理异常在普通情况下我们通常使用try-catch代码块来处理异常但在TPL中最底层的异常会被封装为一个AggregateException的通用异常如果需要获取真正的异常则需要访问InnerException属性相关实现如图所示相关代码如下using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks;namespace TPLDemo {class Program{static void Main(string[] args){Taskint task;try{task Task.Run(() TaskMethod(任务1, 2));int result task.Result;Console.WriteLine($结果为{result});}catch (Exception ex){Console.WriteLine($发生异常{ex});}Console.WriteLine(----------------------------------------------------------------------------------------);Console.Read();}static int TaskMethod(string name, int seconds){Console.WriteLine($Task {name} 是一个正在线程id为 {Thread.CurrentThread.ManagedThreadId} 上运行的任务是否为线程池线程{Thread.CurrentThread.IsThreadPoolThread});Thread.Sleep(TimeSpan.FromSeconds(seconds));throw new Exception(异常);}} }运行后结果如图所示从代码实现和运行结果中我们可以看出调用Task的Result属性会使得当前线程等待直到该任务完成并将异常传播到当前线程因此我们可以通过catch捕获到该异常且该异常的类型为AggregateException同时我们打印出的结果包含底层真正异常内容。但在TPL中还有另外一种方式来处理异常那就是使用Task的GetAwaiter和GetResult方法来获取结果相关代码如下using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks;namespace TPLDemo {class Program{static void Main(string[] args){Taskint task;try{task Task.Run(() TaskMethod(任务1, 2));int result task.Result;Console.WriteLine($结果为{result});}catch (Exception ex){Console.WriteLine($发生异常{ex});}Console.WriteLine(----------------------------------------------------------------------------------------);Console.WriteLine();try{task Task.Run(() TaskMethod(任务2, 2));int result task.GetAwaiter().GetResult();Console.WriteLine($结果为{result});}catch (Exception ex){Console.WriteLine($发生异常{ex});}Console.WriteLine(----------------------------------------------------------------------------------------);Console.Read();}static int TaskMethod(string name, int seconds){Console.WriteLine($Task {name} 是一个正在线程id为 {Thread.CurrentThread.ManagedThreadId} 上运行的任务是否为线程池线程{Thread.CurrentThread.IsThreadPoolThread});Thread.Sleep(TimeSpan.FromSeconds(seconds));throw new Exception(异常);}} }运行后结果如图所示我们从结果中可以看出在这种情况下可以直接捕获到底层异常而无需再访问InnerException属性原因是TPL模型会直接提取该异常进行处理。由上述两种情况我们可以得出结论如果你需要直接获取并处理底层异常那么请使用GetAwaiter和GetResult方法来获取Task的结果反之则可直接使用Result属性。任务并行我们在之前的示例中都是单独创建任务并执行每个任务的执行过程和结果都是独立的。那么如果我们需要多个任务并行要怎么做呢可以使用如下方式我们分别创建了三个任务但任务之间并不再是无关联的关系而是使用了Task.WhenAll与ContineWith来使得它们以某种方式关联起来。相关代码如下using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks;namespace TPLDemo {class Program{static void Main(string[] args){var firstTask new Taskint(() TaskMethod(任务1, 3));var secondTask new Taskint(() TaskMethod(任务2, 2));var whenAllTask Task.WhenAll(firstTask, secondTask);whenAllTask.ContinueWith(x {Console.WriteLine($任务1结果为{x.Result[0]},任务2结果为{x.Result[1]});}, TaskContinuationOptions.OnlyOnRanToCompletion);firstTask.Start();secondTask.Start();Console.Read();}static int TaskMethod(string name, int seconds){Console.WriteLine($Task {name} 是一个正在线程id为 {Thread.CurrentThread.ManagedThreadId} 上运行的任务是否为线程池线程{Thread.CurrentThread.IsThreadPoolThread});Thread.Sleep(TimeSpan.FromSeconds(seconds));return 42 * seconds;}} }运行后结果如图所示分析代码及运行结果我们可以得知在前两个任务完成后第三个任务才开始运行并且该任务的结果提供了一个结果数组第一个元素是第一个任务的结果第二个元素是第二个任务的结果以此类推。在TPL中我们也可以创建另外一系列任务并使用Task.WhenAny的方式等待这些任务中的任何一个执行完成。当有一个任务完成时会从列表中移除该任务并继续等待其他任务完成直到列表为空为止。获取任务的完成进展情况或在运行任务时使用超时都可以使用Task.WhenAny方法。例如我们等待一组任务运行并且使用其中一个任务来记录是否超时如果该任务先完成那么我们只需取消其他还未完成的任务即可。小结我们在这一篇中讲解了TPL的发展历程和使用方式对比APM和EAP模型TPL显得比较灵活且功能强大支持取消、异常和并行等操作。但TPL模型仍有它的不足之处阅读此类程序代码时仍难以理解程序的实际执行顺序。处理异常时不得不使用单独的后续操作任务来处理在之前的异步操作中发生的错误导致了代码比较分散增加了复杂度。所以为了解决这些问题微软直接从语言层面引入了更高级别的抽象真正简化了异步编程使得编写异步程序更为容易。那么它又是什么呢它能为我们提供多少便利性呢预知后事如何且听下回分解。您的点赞和在看是我创作的最大动力感谢支持公众号wacky的碎碎念知乎wacky
http://www.zqtcl.cn/news/509038/

相关文章:

  • 濮阳做网站的番禺区网络推广渠道
  • 杭州网站seo外包外链图片
  • 苏州网站建设有限公司枣阳建网站
  • 网站开发平台选择如何制作购物网站
  • 专业建设网站企业外包公司企业网站
  • 网站开发需求确认书国家商标注册官网查询系统
  • 国内个人网站建设wordpress 添加搜索
  • 网站建设创新简述网站开发具体流程
  • wordpress小说网站模板南宁企业网站seo
  • 网站开发与设计课程时间网站推广的搜索引擎推广
  • 网站首页幻灯片不显示网页设计制作项目
  • 遂宁网站建设哪家好深圳做响应式网站设计
  • 慈溪建设企业网站wordpress 增加分类字段
  • 毕业设计做系统网站wordpress修改评论框
  • 上海网站开发孵化设计者联盟官网
  • 旅游网站开发需求报告微信创建小程序
  • 不收费推广网站有哪些h5网站要多久
  • seo网站营销推广全...互联网创业好项目
  • vx小程序制作网站优化标题怎么做
  • 做旅游网站课程设计报告湘潭学校网站建设 x磐石网络
  • 接网站 建设没有网站可以做seo排名吗
  • 抚顺网站seo建设网站需要支付什么插件费用吗
  • 东台做淘宝网站电子商务是学什么
  • 建一个购物网站多少钱wordpress托管在哪里
  • 怎么建设免费网站北京最大的火车站
  • 做视频网站被判刑豫建设标 网站
  • 济南网站建设济南wordpress计次查询
  • 做英文小工具网站赚钱商城网站是免费开吗
  • 做网站需要注意的问题seo推广代运营
  • 采购网站大全wordpress decorum