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

企业建设H5响应式网站的5大好处网站备案后经营

企业建设H5响应式网站的5大好处,网站备案后经营,制作网站的过程,全网最低价业务网站异步与并行的联系大家知道“并行”是利用CPU的多个核心或者多个CPU同时执行不同的任务#xff0c;我们不关心这些任务之间的依赖关系。但是在我们实际的业务中#xff0c;很多任务之间是相互影响的#xff0c;比如统计车间全年产量的运算要依赖于各月产量的统计结果。假如你… 异步与并行的联系大家知道“并行”是利用CPU的多个核心或者多个CPU同时执行不同的任务我们不关心这些任务之间的依赖关系。但是在我们实际的业务中很多任务之间是相互影响的比如统计车间全年产量的运算要依赖于各月产量的统计结果。假如你想在计算月产量的时候做些其他事情如导出生产异常报表“异步”就可以登上舞台了。说到异步必须要先提一下同步。一图胜千言图中操作C的执行依赖B的结果B的执行依赖A的结果。线程1连续执行操作A、B、C便是一个同步过程相对地线程1执行完A后把结果给线程2线程2开始执行B完成后把B的结果通知到线程1线程1开始执行C,线程1在等待操作B结果的时候执行了D这就是一个异步的过程此外异步过程中B和D是并行执行的。并行会提高业务的执行效率但异步不会异步甚至会拖慢业务的执行比如上面A-B-C的执行过程。异步是让等待变得更有价值,这种价值则体现在多个业务的并行上。C#中的异步在需要长时间等待的地方都可以使用异步比如读写文件、访问网络或者处理图片。特别是在UI线程中我们要保持界面的响应性耗时的操作最好都使用异步的方式执行。.NET提供了三种异步模式IAsyncResult模式APM基于事件的异步模式EAP基于任务的异步模式TAP其中基于任务的异步模式是.NET推荐的异步编程方式。IAsyncResult异步模式APM下面是IAsyncResult基于委托的用法。private delegate void AsyncWorkCaller(int workNo);public static void Run(){ Console.WriteLine(${DateTime.Now:HH:mm:ss.ffffff} thread #{Thread.CurrentThread.ManagedThreadId} will do some work.); AsyncWorkCaller caller DoWork; AsyncCallback callback ar { Console.WriteLine(${DateTime.Now:HH:mm:ss.ffffff} thread #{Thread.CurrentThread.ManagedThreadId} did the callback. [{ar.AsyncState}]); }; IAsyncResult result caller.BeginInvoke(1, callback, callback msg); DoWork(2); caller.EndInvoke(result); DoWork(3); Console.WriteLine(${DateTime.Now:HH:mm:ss.ffffff} thread #{Thread.CurrentThread.ManagedThreadId} done the work.);}private static void DoWork(int workNo){ Console.WriteLine(${DateTime.Now:HH:mm:ss.ffffff} work #{workNo} started with thread #{Thread.CurrentThread.ManagedThreadId}.); Thread.Sleep(1000); Console.WriteLine(${DateTime.Now:HH:mm:ss.ffffff} work #{workNo} done with thread #{Thread.CurrentThread.ManagedThreadId}.);}我们使用BeginInvoke来异步执行作业1同时可以执行作业2调用EndInvoke的时候当前线程被阻塞直到作业1完成。我们也可以使用result.AsyncWaitHandle.WaitOne()来等待异步作业完成同样会阻塞当前线程。此外可以为异步作业增加回调异步作业在完成时会执行回调函数。基于事件的异步模式EAP事件大家不会陌生我们在Winform编程的时候总会用到事件。下面是利用BackgroundWorker实现的一个基于事件的简单异步过程。我们给异步对象这里是BackgroundWorker订阅DoWork和RunWorkCompleted事件当调用RunWorkerAsync时触发异步对象的工作事件此时会开辟一个新线程来执行目标操作。目标操作完成时触发工作完成事件执行后续操作。与IAsyncResult模式不同的是作业完成后的后续操作会在另外的一个线程执行而IAsyncResult模式中完成回调会在目标操作的执行线程中执行。public static class EventBasedAsync{private static readonly BackgroundWorker worker new BackgroundWorker();static EventBasedAsync(){ worker.DoWork Worker_DoWork; worker.RunWorkerCompleted Worker_RunWorkerCompleted; }public static void Run(){ Console.WriteLine(${DateTime.Now:HH:mm:ss.ffffff} thread #{Thread.CurrentThread.ManagedThreadId} will do some work.); worker.RunWorkerAsync(1); DoWork(2); DoWork(3); Console.WriteLine(${DateTime.Now:HH:mm:ss.ffffff} thread #{Thread.CurrentThread.ManagedThreadId} done the work.); }private static void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e){ Console.WriteLine(${DateTime.Now:HH:mm:ss.ffffff} thread #{Thread.CurrentThread.ManagedThreadId} did something when work completed.); }private static void Worker_DoWork(object sender, DoWorkEventArgs e){ DoWork((int)e.Argument); } private static void DoWork(int workNo){ Console.WriteLine(${DateTime.Now:HH:mm:ss.ffffff} work #{workNo} started with thread #{Thread.CurrentThread.ManagedThreadId}.); Thread.Sleep(3000); Console.WriteLine(${DateTime.Now:HH:mm:ss.ffffff} work #{workNo} done with thread #{Thread.CurrentThread.ManagedThreadId}.); }}实际上我们可以利用AsyncOperationManager实现自己的异步对象,可以使用dnSpy对BackgroundWorker进行反编译观察具体的实现过程。基于任务的异步模式TAP在《C#并行编程4基于任务的并行》中我们已经总结过Task和TaskT的用法这里主要关注的是C#的async/await语法与Task的结合用法。在C#中我们使用async标记定义一个异步方法使用await来等待一个异步操作。简单的用法如下public async Task DoWorkAsync(){await Task.Delay(1000);}public async Taskint DoWorkAndGetResultAsync(){await Task.Delay(1000);return 1;}用async/await编写异步过程很方便但异步方法的执行过程是怎样呢下面的例子展示了一个异步操作的调用过程我们以这个例子来分析异步方法的调用过程。public static async Task Run(){ Console.WriteLine(${DateTime.Now:HH:mm:ss.ffffff} thread #{Thread.CurrentThread.ManagedThreadId} will do some work.); Task workTask1 DoWork(1); Console.WriteLine(${DateTime.Now:HH:mm:ss.ffffff} thread #{Thread.CurrentThread.ManagedThreadId} got task #{workTask1.Id} by async call.); Task workTask2 DoWork(2);await workTask2; Console.WriteLine(${DateTime.Now:HH:mm:ss.ffffff} thread #{Thread.CurrentThread.ManagedThreadId} got task #{workTask2.Id} by async call.); Task workTask3 DoWork(3);await workTask3; Console.WriteLine(${DateTime.Now:HH:mm:ss.ffffff} thread #{Thread.CurrentThread.ManagedThreadId} got task #{workTask3.Id} by async call.); Console.WriteLine(${DateTime.Now:HH:mm:ss.ffffff} thread #{Thread.CurrentThread.ManagedThreadId} done the work.);}private static async Task DoWork(int workNo){ Console.WriteLine(${DateTime.Now:HH:mm:ss.ffffff} work #{workNo} started with thread #{Thread.CurrentThread.ManagedThreadId}.); DateTime now DateTime.Now;await Task.Run(() { Console.WriteLine(${DateTime.Now:HH:mm:ss.ffffff} work #{workNo} was running by task #{Task.CurrentId} with thread #{Thread.CurrentThread.ManagedThreadId}.);while (now.AddMilliseconds(3000) DateTime.Now) { } }); Console.WriteLine(${DateTime.Now:HH:mm:ss.ffffff} work #{workNo} done with thread #{Thread.CurrentThread.ManagedThreadId}.);}先来看一下例子的输出19:07:33.032779 thread #10 will do some work.19:07:33.039762 work #1 started with thread #10.19:07:33.075664 thread #10 got task #2 by async call.19:07:33.075664 work #2 started with thread #10.19:07:33.078658 work #2 was running by task #3 with thread #11.19:07:33.082647 work #1 was running by task #1 with thread #6.19:07:36.040739 work #1 done with thread #6.19:07:36.077638 work #2 done with thread #11.19:07:36.077638 thread #11 got task #4 by async call.19:07:36.077638 work #3 started with thread #11.19:07:36.077638 thread #11 got task #7 by async call.19:07:36.077638 thread #11 done the work.19:07:36.077638 work #3 was running by task #6 with thread #12.19:07:39.077652 work #3 done with thread #12.在上面的输出中我们单看work #1,它由thread #10启动计算过程在thread #6中执行并结束最后任务在thread #10中返回这里我们没有使用await来等待work #1的异步任务假如我们使用await等待异步任务如work #2它在thread #10中启动计算过程在thread #11中执行并结束任务最后在thread #11中返回。大家可能发现了两者的不同await改变了Run()方法的执行线程从DoWork()方法的执行也能够看出await会改变异步方法的执行线程!实际上编译器会把异步方法转换成状态机结构执行到await时编译器把当前正在执行方法任务挂起当await的任务执行完成时编译器再恢复挂起的方法所以我们的输出中异步方法await前面和后面的代码一般是在不同的线程中执行的。编译器通过这种状态机的机制使得等待异步操作的过程中线程不再阻塞进而增强响应性和线程利用率。理解异步方法的执行机制后相信对异步的应用会变得更加娴熟这里就不再总结异步的具体用法。原文地址https://www.cnblogs.com/chenbaoshun/p/10671403.html.NET社区新闻深度好文欢迎访问公众号文章汇总 http://www.csharpkit.com
http://www.pierceye.com/news/892049/

相关文章:

  • 做双语网站多少钱建立设计网站富阳
  • 为什么有网网站打不开怎么回事网站怎样添加友情链接
  • 中国五码一级做爰网站wordpress去掉评论注册
  • 网站备案修改域名贵阳仿站定制模板建站
  • 渭南 网站集约化建设淘宝网站开发技术名称
  • 临沂做网站费用wordpress新浪微博图床插件
  • 游戏网站建设收费明细WordPress 中英文翻译
  • 如何建设一个企业网站wordpress底部导航代码
  • 公司网站页面设计思路互联网家装公司
  • 网站文字源码网上购物商城源代码
  • 彩票网站做一级代理犯法吗购物网站开发设计类图
  • 固镇做网站多少钱乐清网络公司哪家好
  • 绿色农业网站模板做网站有什么比较好看的动效
  • 百度aipage智能建站系统wordpress打印代码
  • 深圳招聘官网深圳搜索引擎优化推广便宜
  • 创建网站大约9377传奇
  • 单页面网站可以做自适应网站吗建筑设计培训
  • 做海报可以在哪些网站下载素材一键生成装修效果图app
  • 福田区住房和建设局官方网站wordpress仿凡客商城主题
  • 做下载网站用什么程序好深圳公司注册服务
  • 猎头网站模板济源专业网站建设(制作网站)
  • kotlin做网站单页应用网站
  • 邢台网站改版开发长沙教育网站开发
  • 网站开发人员必备技能网站背景图片自动切换
  • 企业网站建立策划书有网站吗给一个
  • 外贸建站有哪些公司建设主管部门网站查询
  • 泰安市网站建设广州优化公司哪家好
  • 手机网游传奇西安关键词优化平台
  • 网站建设公司权威机构3d虚拟人物制作软件
  • 北京网站建设seo公司哪家好阿里巴巴企业邮箱登录入口