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

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

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

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

实际工作中,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的系统方法和事件。

class Program
{
private static async void Test()
{
Task<int> t = new Task<int>(() => { Thread.Sleep(); return ; });
t.Start();
int tr = await t;
Console.WriteLine(tr);
} static void Main(string[] args)
{
Test();
Console.WriteLine("Main");
Console.ReadKey();
}
}

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

也可以使用:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace ConsoleApplication11
{
class Program
{
static void Main(string[] args)
{
Test();
Console.WriteLine("Main");
Console.ReadKey();
} private static async void Test()
{
var t = Task<int>.Run(() => { Thread.Sleep(); return ; });
Console.WriteLine(await t);
}
}
}

使用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)
private async void Sync_Button_Click(object sender, RoutedEventArgs e) {
: OutputTextBlock.Text += "開始" + Environment.NewLine;
: // 這裡會等 getFileContentAsync() 執行完畢後, 再執行貼上結束字串那一行
: // 因為 Compiler 會再 await 這行下斷點
: OutputTextBlock.Text += await getFileContentAsync();
: OutputTextBlock.Text += "結束" + Environment.NewLine;
: }
:
: private async Task<string> getFileContentAsync() {
: StorageFolder folder = KnownFolders.DocumentsLibrary;
: StorageFile file = await folder.GetFileAsync(TESTED_FILE_NAME);
: var result = await FileIO.ReadTextAsync(file) + Environment.NewLine;
: return result;
: }

在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. 国庆送干货——前端建站实用UI工具vajoyJS

    差不多是从七月开始有空就写一写,写到现在也算是可以拿出来展示了,vajoyJS是一款可以提供多项建站常用UI功能的插件库,让你轻松创建简易幻灯片.模态窗口和单屏滚页等效果.vajoyJS依赖于 jQu ...

  2. javascript 设计模式-----单例模式

    单例模式的意思是只需要实例化某个类一次,它的方法也比较简单,通过判断某个类是否已经被实例化了,再返回该值.可以通过各种方法来实现单例模式,下面我们采取以下这种实现方式: var single = (f ...

  3. 分布式系统之Quorum (NRW)算法

    基于Quorum投票的冗余控制算法 Quorom 机制,是一种分布式系统中常用的,用来保证数据冗余和最终一致性的投票算法,其主要数学思想来源于鸽巢原理. 在有冗余数据的分布式存储系统当中,冗余数据对象 ...

  4. Linux tr命令

    介绍 tr命令可以对来自标准输入的字符进行替换.压缩和删除.tr只能接收来自标准的输入流,不能接收参数. 语法 tr [OPTION]... SET1 [SET2] 注意:SET2是可选项 OPTIO ...

  5. 【译】用jQuery 处理XML-- DOM(文本对象模型)简介

    用jQuery 处理XML--写在前面的话 用jQuery 处理XML-- DOM(文本对象模型)简介 用jQuery 处理XML--浏览器中的XML与JavaScript 用jQuery 处理XML ...

  6. 成都亚马逊AWSome Day回顾

    6月25日我和公司同仁一起参加了亚马逊在成都的第一场AWSome Day活动.整个活动时间异常紧促,短短一天包含了7堂session,讲师的狂轰乱炸使得我们同学们普遍觉得比上班累多了.好了,废话不多说 ...

  7. 细说.NET 中的多线程 (一 概念)

    为什么使用多线程 使用户界面能够随时相应用户输入 当某个应用程序在进行大量运算时候,为了保证应用程序能够随时相应客户的输入,这个时候我们往往需要让大量运算和相应用户输入这两个行为在不同的线程中进行. ...

  8. 纠结于搞.Net待遇不高的同学入...

    最近看到不少抱怨搞.net工资低的帖子.别的方向我不是太清楚,作为搞了近8年.Net信息系统开发的码农也想发表下自己的意见. 由于我的阅历和能力有限,首先想限定下本文的范围.这里说的“信息系统”主要包 ...

  9. Java基础之多线程

    1.进程和线程: 进程:正在进行的程序.每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元. 线程:进程内部的一条执行路径或者一个控制单元. 两者的区别: 一个进程至少有一个线程 ...

  10. Atitit vod ver 12 new feature v12 pb2 影吧 视频 电影 点播 播放系统v12新特性

    Atitit vod ver 12 new feature v12 pb2 影吧 视频 电影 点播 播放系统v12新特性 项目分离从独立的se ver Run mode from brow ex to ...