首先,在mvc中如果要用纯异步请不要使用async和await,可以直接使用Task.Run。

其次,在mvc中使用async和await可以让系统开新线程处理Task的代码,同时不必等Task执行结束,就可以同时运行Task之后的代码,加快效率。

要注意的是:如果使用async和await,系统虽然可以同时处理多个事务,但客户端(浏览器)不会有响应,依然要等到所有代码全部执行完毕(包括异步的代码)才能正常响应。

  1. /*
  2. * 演示如何利用 .net 4.5 的新特性实现异步操作
  3. *
  4. * 什么场景下需要异步操作?
  5. * 在因为磁盘io或网络io而导致的任务执行时间长的时候应该使用异步操作,如果任务执行时间长是因为cpu的消耗则应使用同步操作(此时异步操作不会改善任何问题)
  6. * 原理是什么?
  7. * 在 Web 服务器上,.NET Framework 维护一个用于服务 ASP.NET 请求的线程池(以下把 .NET Framework 维护的用于服务 ASP.NET 请求的线程池称作为“特定线程池”)
  8. * 同步操作时,如果特定线程池利用满了,则不会再提供服务
  9. * 异步操作时:
  10. * 1、一个请求过来,特定线程池出一个线程处理此请求
  11. * 2、启动一个非特定线程池中的另一个线程处理异步操作,此时处理此请求的线程就会空出来,不会被阻塞,它可以继续处理其它请求
  12. * 3、异步操作执行完毕后,从特定线程池中随便找一个空闲线程返回请求结果
  13. */

实际工作中,async和await我们可以用于类似用户上传头像、上传照片这种的耗时较长的功能中,我们可以在边上传照片时边处理数据库的其他事务。

而纯异步则多用于时间较长,而无需结果实时看反馈给用户的操作,例如:管理在后台备份数据库、清理垃圾文件等。

如果async和await的异步方法是有返回值的,而且主方法中又要使用这个返回值,那么将不会实现多个异步方法同时执行,要等异步结果后才继续执行,相当于异步并未起到多程序同时处理事务的目的。这仅是对于Web或控制台程序而言的,如果对于Winform则有大大的不同,因为Winform如果使用异步时界面是可以响应的。

Web中异步更多的是用来实现大量IO操作,或大量调用WCF、WebService时使用。

所以,在Mvc这种Web界面中使用async和await异步的实际意义就不是很大了,因为界面总是没有响应的,而且也无法实现多线程同时工作。

有需要请看这篇:http://www.dozer.cc/2012/03/async-and-await-in-web-application/

async的作用是异步执行,await的作用是等待执行结果(会卡住异步方法中await以下的代码,但不会卡死主线程)。

async一般最终都需要一个async void方法来进行最高层的调用。比如:private async void Sync_Button_Click(object sender, RoutedEventArgs e),C#中也提供了大量的可设置async的系统方法和事件。

  1. class Program
  2. {
  3. private static async void Test()
  4. {
  5. Task<int> t = new Task<int>(() => { Thread.Sleep(); return ; });
  6. t.Start();
  7. int tr = await t;
  8. Console.WriteLine(tr);
  9. }
  10.  
  11. static void Main(string[] args)
  12. {
  13. Test();
  14. Console.WriteLine("Main");
  15. Console.ReadKey();
  16. }
  17. }

Test函数就用最简单的方法使用了这两个关键字,执行这段代码,首先输出“Main”,然后3秒钟后会输出“1”。

也可以使用:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading;
  6. using System.Threading.Tasks;
  7.  
  8. namespace ConsoleApplication11
  9. {
  10. class Program
  11. {
  12. static void Main(string[] args)
  13. {
  14. Test();
  15. Console.WriteLine("Main");
  16. Console.ReadKey();
  17. }
  18.  
  19. private static async void Test()
  20. {
  21. var t = Task<int>.Run(() => { Thread.Sleep(); return ; });
  22. Console.WriteLine(await t);
  23. }
  24. }
  25. }

使用async异步编程时,请注意如下事项:

    1. async void函数只能在UI Event回调中使用。
    2. async void函数中一定要用try-catch捕获所有异常,否则会很容易导致程序崩溃。
    3. async void类型的lambda表达式非常隐蔽,并且容易在无意中编写出来,尤其需要注意。
    4. 不要忽视CS4014告警,更不要为了消除CS4014告警而改用async void函数。
      确实无需等待的async Task函数用我前面写的扩展函数IgnorCompletion消除这个告警。
    5. 注册TaskScheduler.UnobservedTaskException事件,记录Task中未处理异常信息,方便分析及错误定位。(注意,这个回调里面不能进行耗时操作,具体原因参看前面的老赵的那篇Blog)
  1. private async void Sync_Button_Click(object sender, RoutedEventArgs e) {
  2. : OutputTextBlock.Text += "開始" + Environment.NewLine;
  3. : // 這裡會等 getFileContentAsync() 執行完畢後, 再執行貼上結束字串那一行
  4. : // 因為 Compiler 會再 await 這行下斷點
  5. : OutputTextBlock.Text += await getFileContentAsync();
  6. : OutputTextBlock.Text += "結束" + Environment.NewLine;
  7. : }
  8. :
  9. : private async Task<string> getFileContentAsync() {
  10. : StorageFolder folder = KnownFolders.DocumentsLibrary;
  11. : StorageFile file = await folder.GetFileAsync(TESTED_FILE_NAME);
  12. : var result = await FileIO.ReadTextAsync(file) + Environment.NewLine;
  13. : return result;
  14. : }

在MVC中使用async和await的说明的更多相关文章

  1. [译] C# 5.0 中的 Async 和 Await (整理中...)

    C# 5.0 中的 Async 和 Await [博主]反骨仔 [本文]http://www.cnblogs.com/liqingwen/p/6069062.html 伴随着 .NET 4.5 和 V ...

  2. C# 中的Async 和 Await 的用法详解

    众所周知C#提供Async和Await关键字来实现异步编程.在本文中,我们将共同探讨并介绍什么是Async 和 Await,以及如何在C#中使用Async 和 Await. 同样本文的内容也大多是翻译 ...

  3. ES7中的async和await

    ES7中的async和await 在上一章中,使用Promise将原本的回调方式转换为链式操作,这就将一个个异步执行的操作串在一条同步线上了.下一次的操作必须等待当前操作的结束. 使用Promise的 ...

  4. async和await的使用总结 ~ 竟然一直用错了c#中的async和await的使用。。

    对于c#中的async和await的使用,没想到我一直竟然都有一个错误.. ..还是总结太少,这里记录下. 这里以做早餐为例 流程如下: 倒一杯咖啡. 加热平底锅,然后煎两个鸡蛋. 煎三片培根. 烤两 ...

  5. ES2017 中的 Async 和 Await

    ES2017 在 6 月最终敲定了,随之而来的是广泛的支持了我最喜欢的最喜欢的JavaScript功能: async(异步) 函数.如果你也曾为异步 Javascript 而头疼,那么这个就是为你设计 ...

  6. .NET中的async和await关键字使用及Task异步调用实例

    其实早在.NET 4.5的时候M$就在.NET中引入了async和await关键字(VB为Async和Await)来简化异步调用的编程模式.我也早就体验过了,现在写一篇日志来记录一下顺便凑日志数量(以 ...

  7. C# 中的 Async 和 Await

    这篇文章由Filip Ekberg为DNC杂志编写. 自跟随着.NET 4.5 及Visual Studio 2012的C# 5.0起,我们能够使用涉及到async和await关键字的新的异步模式.有 ...

  8. es2017中的async和await要点

    1. async和await最关键的用途是以同步的写法实现了异步调用,是对Generator异步方法的简化和改进.使用Generator实现异步的缺点如下: 得有一个任务执行器来自动调用next() ...

  9. ES7中的async 和 await

    async 和 await 一个函数如果加上 async ,那么该函数就会返回一个 Promise async function test() { return "1" } con ...

随机推荐

  1. 推荐书籍 -《移动App测试的22条军规》

    在今天的博文中,博主希望给大家分享一本博主同事黄勇的最新利作:<移动App测试的22条军规>.黄勇是ThoughtWorks资深敏捷QA和咨询师.对于我来说,和黄勇在一起的工作的这个项目, ...

  2. VS2012下配置MPI

    并行处理结课实验,要用到MPI编程,我的电脑和VS2012都是64位的,以为MPICH也得是64位才行,结果饶了很大的弯——配置正确,添加引用之后,仍然无法识别MPI函数. 后来换了个32位的MPIC ...

  3. js模版引擎handlebars.js实用教程——由于if功力不足引出的Helper

    返回目录 <!DOCTYPE html> <html> <head> <META http-equiv=Content-Type content=" ...

  4. Vue 子组件向父组件传参

    直接上代码 <body> <div id="counter-event-example"> <p>{{ total }}</p> & ...

  5. servlet到底是什么?

    Servlet(Server Applet),全称Java Servlet,是用Java编写的服务器端程序.指任何实现了这个Servlet接口的类或者实现Servlet接口的类,当然或者实现接口继承方 ...

  6. 中小公司PMO不一样期间的责任

    中小公司,又称中小型公司或中小企,它是与所在行业的大公司对比在人员规划.财物规划与运营规划上都对比小的经济单位.此类公司一般可由单自个或少数人供给资金构成,其招聘人数与营业额皆不大,因此在运营上多半是 ...

  7. 用css来写一些简单的图形

    在写网页的过程中,有时我们需要用到一些简单的图片但是手头又没有合适的,我们其实可以自己来写,下面我就简单的介绍几个例子: 1.上三角 Triangle Up #triangle-up { width: ...

  8. WebClient.DownloadFile(线程机制,异步下载文件)

    线程机制(避免卡屏),异步下载文件. 我做网站的监控,WebClient.DownloadFile这个方法是我经常用到的,必要的时候肯定是要从网上下载些什么(WebRequest 也可以下载网络文件, ...

  9. Nexus3.0私服搭建

    官方文档:http://books.sonatype.com/nexus-book/3.0/reference/install.html 1.下载 http://www.sonatype.com/do ...

  10. Ubuntu-安装-theano+caffe-超详细教程

    一.说明 本文是继<Ubuntu-安装-cuda7.0-单显卡-超详细教程> 之后的续篇.theano和caffe是深度学习库,对运算能力需求很大,最好使用cuda进行加速.所以,请先阅读 ...