MVC 5中Async和await使用

掌握C# 5.0与.NET 4.5.1的专业指南 在C# 4.0中引入的dynamic关键字提供了一种新的类型系统,它允许开发者在编译时期跳过类型检查,而将检查延迟到运行时。这种特性在与动态语言(如IronPython和JavaScript)交互时显得尤为有用,同时也为处理COM接口和反射等场景提供了便利。动态类型不是一种新的类型,实际上它是一个静态类型的别名。这意味着,任何被声明为dynamic的变量,在编译时期都会被视为object。编译器不会对dynamic类型的变量进行类型检查,所有操作都会在运行时进行检查并解析。 阅读详情

HomeController.cs

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Web;
using System.Web.Mvc;

namespace Async.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult GetList()
        {
            //创建一个秒表来获取执行时间
            var watch = new Stopwatch();
            watch.Start();

            var country = GetCountry();
            var state = GetState();
            var city = GetCity();

            watch.Stop();
            ViewBag.WatchMilliseconds = watch.ElapsedMilliseconds;

            return View();
        }

        public async Task<ActionResult> GetListAsync()
        {
            //创建一个秒表来获取执行时间
            var watch = new Stopwatch();
            watch.Start();

            var country = GetCountryAsync();
            var state = GetStateAsync();
            var city = GetCityAsync();

            var content = await country;
            var count = await state;
            var name = await city;

            watch.Stop();
            ViewBag.WatchMilliseconds = watch.ElapsedMilliseconds;

            return View();
        }

        #region GetCountry方法GetList && GetListAsync
        public string GetCountry()
        {
            Thread.Sleep(3000); //使用 - 当你想阻塞当前线程
            return "India";
        }

        public async Task<string> GetCountryAsync()
        {
            await Task.Delay(3000); //使用 - 当您想要逻辑延迟而不阻塞当前线程
            return "India";
        }
        #endregion

        #region GetState方法用于GetList && GetListAsync
        public string GetState()
        {
            Thread.Sleep(5000); //使用 - 当你想阻塞当前线程
            return "Gujarat";
        }

        public async Task<string> GetStateAsync()
        {
            await Task.Delay(5000); //使用 - 当您想要逻辑延迟而不阻塞当前线程
            return "Gujarat";
        }
        #endregion

        #region  GetCity方法GetList && GetListAsync
        public string GetCity()
        {
            Thread.Sleep(6000); //使用 - 当你想阻塞当前线程
            return "Junagadh";
        }

        public async Task<string> GetCityAsync()
        {
            await Task.Delay(6000); //使用 - 当您想要逻辑延迟而不阻塞当前线程
            return "Junagadh";
        }
        #endregion

    }
}

Index.cshtml

@{
    ViewBag.Title = "Index";
}
<link href="~/Content/docs.css" rel="stylesheet" />
<link href="~/Content/codemirror.css" rel="stylesheet" />
<script src="~/Content/codemirror.js"></script>
<script src="~/Content/edit/matchbrackets.js"></script>
<link href="~/Content/hint/show-hint.css" rel="stylesheet" />
<script src="http://localhost:53054/Content/hint/show-hint.js"></script>
<script src="~/Content/clike.js"></script>
<style>
    .CodeMirror {
        border: 2px inset #dee;
    }
</style>
<br /> <br />
<div class="row">

    @using (Html.BeginForm("GetList", "Home", FormMethod.Get))
    {
        <div class="col-md-6 col-sm-12">
            <h2>Synchronize Method</h2>
            <div>
                <textarea id="c-code">
                    public ActionResult GetList()
                    {
                    //创建一个秒表来获取执行时间
                    var watch = new Stopwatch();
                    watch.Start();

                    var country = GetCountry();
                    var state = GetState();
                    var city = GetCity();

                    watch.Stop();
                    ViewBag.WatchMilliseconds = watch.ElapsedMilliseconds;

                    return View();
                    }
                </textarea>
            </div>
            <br />
            <button type="submit" class="btn btn-primary">Get Excecution Time</button>
            @if (ViewBag.WatchMilliseconds != null)
            {
                <h1 class="label label-danger">@ViewBag.WatchMilliseconds 毫秒</h1>
            }
        </div>
    }

    @using (Html.BeginForm("GetListAsync", "Home", FormMethod.Get))
    {
        <div class="col-md-6 col-sm-12">
            <h2>Asynchronize Method</h2>
            <div>
                <textarea id="c-code2">
                    public async Task<actionresult>
                        GetListAsync()
                        {
                        //创建一个秒表来获取执行时间
                        var watch = new Stopwatch();
                        watch.Start();

                        var country = GetCountryAsync();
                        var state = GetStateAsync();
                        var city = GetCityAsync();

                        var content = await country;
                        var count = await state;
                        var name = await city;

                        watch.Stop();
                        ViewBag.WatchMilliseconds = watch.ElapsedMilliseconds;

                        return View();
                        }
                </textarea>
            </div>
            <br />
            <button type="submit" class="btn btn-primary">Get Excecution Time</button>
            @if (ViewBag.WatchMilliseconds != null)
            {
                <h1 class="label label-danger">@ViewBag.WatchMilliseconds 毫秒</h1>
            }
        </div>
    }
    <script>
        var cEditor = CodeMirror.fromTextArea(document.getElementById("c-code"), {
            lineNumbers: true,
            matchBrackets: true,
            mode: "text/x-csrc"
        });

        var cEditor = CodeMirror.fromTextArea(document.getElementById("c-code2"), {
            lineNumbers: true,
            matchBrackets: true,
            mode: "text/x-csrc"
        });
    </script>
</div>

GetList.cshtml

@{
    ViewBag.Title = "Index";
}
<link href="~/Content/docs.css" rel="stylesheet" />
<link href="~/Content/codemirror.css" rel="stylesheet" />
<script src="~/Content/codemirror.js"></script>
<script src="~/Content/edit/matchbrackets.js"></script>
<link href="~/Content/hint/show-hint.css" rel="stylesheet" />
<script src="http://localhost:53054/Content/hint/show-hint.js"></script>
<script src="~/Content/clike.js"></script>
<style>
    .CodeMirror {
        border: 2px inset #dee;
    }
</style>
<br /> <br />
<div class="row">
    @using (Html.BeginForm("GetList", "Home", FormMethod.Get))
    {
        <div class="col-md-6 col-sm-12">
            <h2>同步方法</h2>
            <div>
                <textarea id="c-code">
                    public ActionResult GetList()
                    {
                    //创建一个秒表来获取执行时间
                    var watch = new Stopwatch();
                    watch.Start();

                    var country = GetCountry();
                    var state = GetState();
                    var city = GetCity();

                    watch.Stop();
                    ViewBag.WatchMilliseconds = watch.ElapsedMilliseconds;

                    return View();
                    }
                </textarea>
            </div>
            <br />
            <button type="submit" class="btn btn-primary">Get Excecution Time</button>
            @if (ViewBag.WatchMilliseconds != null)
            {
                <h1 class="label label-danger">@ViewBag.WatchMilliseconds 毫秒</h1>
            }
        </div>
    }

    @using (Html.BeginForm("GetListAsync", "Home", FormMethod.Get))
    {
        <div class="col-md-6 col-sm-12">
            <h2>异步方法</h2>
            <div>
                <textarea id="c-code2">
                    public async Task<actionresult>
                        GetListAsync()
                        {
                        //Create a stopwatch for getting excution time
                        var watch = new Stopwatch();
                        watch.Start();

                        var country = GetCountryAsync();
                        var state = GetStateAsync();
                        var city = GetCityAsync();

                        var content = await country;
                        var count = await state;
                        var name = await city;

                        watch.Stop();
                        ViewBag.WatchMilliseconds = watch.ElapsedMilliseconds;

                        return View();
                        }
                </textarea>
            </div>
            <br />
            <button type="submit" class="btn btn-primary">获取执行时间</button>

        </div>
    }
    <script>
        var cEditor = CodeMirror.fromTextArea(document.getElementById("c-code"), {
            lineNumbers: true,
            matchBrackets: true,
            mode: "text/x-csrc"
        });

        var cEditor = CodeMirror.fromTextArea(document.getElementById("c-code2"), {
            lineNumbers: true,
            matchBrackets: true,
            mode: "text/x-csrc"
        });
    </script>
</div>

GetListAsync.cshtml

@{
    ViewBag.Title = "Index";
}
<link href="~/Content/docs.css" rel="stylesheet" />
<link href="~/Content/codemirror.css" rel="stylesheet" />
<script src="~/Content/codemirror.js"></script>
<script src="~/Content/edit/matchbrackets.js"></script>
<link href="~/Content/hint/show-hint.css" rel="stylesheet" />
<script src="http://localhost:53054/Content/hint/show-hint.js"></script>
<script src="~/Content/clike.js"></script>
<style>
    .CodeMirror {
        border: 2px inset #dee;
    }
</style>
<br /> <br />
<div class="row">
    @using (Html.BeginForm("GetList", "Home", FormMethod.Get))
    {
        <div class="col-md-6 col-sm-12">
            <h2>同步方法</h2>
            <div>
                <textarea id="c-code">
                    public ActionResult GetList()
                    {
                    //创建一个秒表来获取执行时间
                    var watch = new Stopwatch();
                    watch.Start();

                    var country = GetCountry();
                    var state = GetState();
                    var city = GetCity();

                    watch.Stop();
                    ViewBag.WatchMilliseconds = watch.ElapsedMilliseconds;

                    return View();
                    }
                </textarea>
            </div>
            <br />
            <button type="submit" class="btn btn-primary">获取执行时间</button>
        </div>
    }

    @using (Html.BeginForm("GetListAsync", "Home", FormMethod.Get))
    {
        <div class="col-md-6 col-sm-12">
            <h2>异步方法</h2>
            <div>
                <textarea id="c-code2">
                    public async Task<actionresult>
                        GetListAsync()
                        {
                        //创建一个秒表来获取执行时间
                        var watch = new Stopwatch();
                        watch.Start();

                        var country = GetCountryAsync();
                        var state = GetStateAsync();
                        var city = GetCityAsync();

                        var content = await country;
                        var count = await state;
                        var name = await city;

                        watch.Stop();
                        ViewBag.WatchMilliseconds = watch.ElapsedMilliseconds;

                        return View();
                        }
                </textarea>
            </div>
            <br />
            <button type="submit" class="btn btn-primary">获取执行时间</button>
            @if (ViewBag.WatchMilliseconds != null)
            {
                <h1 class="label label-danger">@ViewBag.WatchMilliseconds 毫秒</h1>
            }
        </div>
    }
    <script>
        var cEditor = CodeMirror.fromTextArea(document.getElementById("c-code"), {
            lineNumbers: true,
            matchBrackets: true,
            mode: "text/x-csrc"
        });

        var cEditor = CodeMirror.fromTextArea(document.getElementById("c-code2"), {
            lineNumbers: true,
            matchBrackets: true,
            mode: "text/x-csrc"
        });
    </script>
</div>

运行结果如图:

同步方法执行时间累加,异步方法执行时间取任何方法的最长等待时间
这里写图片描述


这里写图片描述

深入掌握C# 5.0编程核心:从基础到高级特性实战 C# 5.0于2012年随.NET Framework 4.5发布,标志着异步编程正式进入主流开发范式。其核心升级聚焦于async和await关键字的引入,使异步操作如IO、网络请求等能以同步代码风格编写,极大提升了可读性与维护性。与此同时,C# 5.0进一步强化了与CLR(公共语言运行时)的协同能力,支持更高效的Task调度机制,并深度依赖.NET平台的垃圾回收(GC)、程序集加载与跨语言互操作(通过CLS和CTS)等底层服务。该示例展示了在实际中的简洁应用:方法被标记为。 阅读详情

相关推荐

Android系统编译之Communication error with Jack server (35), try ‘jack-diagnose‘ or see Jack server log

jack server failed场景个人分析网上分析分析1分析2原因1:权限问题原因2:端口占用原因3:删除 TLSv1, TLSv1.1测试结论解决方案说明相关链接 场景 在进行Android系统开发时,在liunx编译时发生问题,描述如下: ninja: build stopped: subcommand failed. build/core/ninja.mk:148: recipe for target 'ninja_wrapper' failed make: *** [ninja_wrapper

weixin_43194854的博客 2401

ASP.NET MVC 5 (五)c#的lambda表达式、LinQ和Async异步处理

简单介绍Lambda表达式和LINQ表达式,详细的C#语言语法查阅一下两个链接,详细实验和解释另外再开一个语法系列。 Lambda表达式基本语法样式 自动接口类型 匿名类型 执行语言集成查询LINQ 一些LINQ扩展方法列表 延迟的LINQ查询

DoongBo的博客 5469

鲁棒优化入门(一)——工具箱Xprog和RSOME的安装与使用

Xprog是由新加坡国立大学的Peng Xiong于2016年发布的一款matlab工具箱,可以用于求解确定性优化、随机优化、鲁棒优化和分布式鲁棒优化问题。 还有一个针对鲁棒随机优化设计的matlab工具箱——RSOME(Robust Stochastic Optimization Made Easy),也可以用来解决一般的线性规划、随机规划、鲁棒优化和数据驱动的分布式鲁棒优化问题。...............

配电网和matlab的博客 1万+

SpringMVC异步请求

为满足耗时任务占用应用服务器连接数,而客户端又必须等待这些耗时长任务返回才能处理下一步工作的场景,Spring 引入了以下机制来处理:使用 Callable 或者 DeferredResult 作为 Controller 的返回值,能够处理异步返回单个结果的场景;使用 ResponseBodyEmitter/SseEmitter 或者StreamingResponseBody 来流式处理多个返回值;在 Controller 中使用响应式客户端调用服务并返回响应式的数据对象Callable。

少年闰土 3710

VSCode搭配Keil开发STM32:从环境配置到代码跳转全流程(避坑指南)

本文详细介绍了如何使用VSCode搭配Keil进行STM32开发,从环境配置到代码跳转的全流程指南。通过安装必备插件和正确配置项目文件,开发者可以在VSCode中享受现代编辑器的便捷功能,同时保留Keil的编译调试能力,提升嵌入式开发效率。

weixin_28832121的博客 253

【代码】获取高级行情数据,并通过 qmt 进行实际下单交易,自动实现止盈止损管理

【代码】获取高级行情数据,并通过 qmt 进行实际下单交易,自动实现止盈止损管理

XD1996CD的博客 4108

MVC(七、action 中使用await和async)

1、AsyncController在mvc的开发过程中,有时候我们会需要在action中调用异步方法,这个时候会需要做一些特殊处理。我们会使用到await和async。对应的controller也应该是async的。 在MVC4中直接可以使用await和async,而MVC3中需要继承AsyncController,才可以使用。2、示例public async Task<ActionResult>

zaichuanguanshui的专栏 8267

R语言使用party包中的ctree函数构建条件推理决策树(Conditional inference trees)、使用plot函数可视化训练好的条件推理决策树、条件推理决策树的叶子节点的阴影区域表

R语言使用party包中的ctree函数构建条件推理决策树(Conditional inference trees)、使用plot函数可视化训练好的条件推理决策树、条件推理决策树的叶子节点的阴影区域表示的是阳性样本的比例

data+scenario+science+insight 1223

ASP.NET MVC 如何在一个同步方法(非async)方法中等待async方法

问题 首先,在ASP.NET MVC 环境下对async返回的Task执行Wait()会导致线程死锁。例: public ActionResult Asv2() { //dead lock var task = AssignValue2(); task.Wait(); ...

weixin_33853827的博客 251

【00】虹软2023届校招专场 ,计算机类笔试攻略(笔试考试时间、考察范围、笔试难度 等说明)

虹软科技2023校招笔试攻略:三大岗位类别(算法、算法优化、开发)分别于7月24日进行。题型包括选择题、编程题和问答题,其中算法类题目降低难度,编程题改为LeetCode模式。重点考察数学基础、机器学习、编程能力(C/C++/Python)、数据结构和算法优化等。建议根据投递岗位选择问答题,算法优化类注重系统知识和SIMD优化,开发类侧重多线程等实际应用能力。笔试结果将作为校招offer的重要参考。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 276

数字电视中的AD(Audio Description)音频描述技术详解

AD(Audio Description)音频描述是一种辅助技术,旨在帮助视障人士更好地理解视觉内容。通过在节目或视频的自然停顿处插入额外的语音叙述来解释屏幕上的视觉信息,如人物动作、场景变化、文字说明等,从而让视力受损的人士也能获得完整的观影体验。AD服务不仅限于电视广播,也广泛应用于电影、剧院表演、在线视频平台等领域。PID:用于标识和区分不同的音频流。PMT表:提供每个音频流的详细信息,包括PID、编解码器类型和语言代码。时间戳:PTS和DTS用于同步音频与视频内容。解复用。

以实战经验介绍行业知识 738

MVC中使用异步方法async await

关于在MVC中使用异步方法async await通过这两个关键字来实现/// &lt;summary&gt; /// 调用webapi获取按钮权限信息 /// &lt;/summary&gt; /// &lt;param name="spid"&gt;&lt;/param&gt; /// &lt;param name="userid"

飞翔的学习笔记 5016

从 0 到 1 玩转小智 AI 智能音箱:开发教程 + 实战项目全攻略

如果说 MCP 是工具箱,那 SDK 就是 “技能模板”—— 小智音箱的自定义技能本质是 “意图识别 + 逻辑响应” 的组合,就像给嵌入式设备写驱动程序,只要按规则调用接口,就能实现各种功能。小智 AI 音箱的开发门槛并不高,核心是利用 MCP SDK 封装好的接口,结合嵌入式开发的 “硬件对接 + 逻辑编程” 思维,就能实现各种自定义功能。从环境搭建到技能开发,再到实战项目落地,每一步都是对 “软件控制硬件” 的实践 —— 而这正是嵌入式开发的核心魅力。

weixin_42300449的博客 1193

C#5 初次接触(一)

C#是一种非常富有表现力和强大的语言,让您可以专注于应用程序而不是低级样板。在过去的十年中,C#编译器已经发展,包括了来自动态和函数式语言的许多功能,同时保持静态类型。最近,它已经应对了并发硬件的激增,引入了新的异步编程功能。本书将帮助您快速了解最新版本的 C#。在设置开发环境后,您将了解语言的所有最新功能,包括任务并行框架、动态语言运行时、TPL 数据流,以及使用 async 和 await 进行异步编程。C#语言的引入正好是在合适的时候,它是一种现代的面向对象的语言,汲取了之前许多语言的优点。

龙哥盟 1008

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

async 与 await 在 Web 下的应用

原文地址:http://www.dozer.cc/2012/03/async-and-await-in-web-application/ 欢迎大家到我的博客中查看,排版会更舒服一点! .net 中的异步 关于 .net 的异步,一篇文章是讲不完的,我这里就贴两篇文章让大家看一下: 《正确使用异步操作》、《C#客户端的异步操作》、《细说ASP.NET的各种异步操作》 另外,在 .ne...

weixin_30483495的博客 225

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

异步控制器, 从ASP.NET MVC 2到4

前言 这篇文章主要针对即将到来的ASP.NET MVC4中的异步控制器做一个回顾和展望, 并未涉及到讨论异步控制器的使用场合, 如果对异步控制器何时使用仍然纠结的同学, 这次可能会让你们失望了, 不过关于这方面的讨论和分析其实蛮多的, 大家也可以自行搜索.好了,废话少说,上正文. 异步控制器 在MS越来越提倡异步操作的时代, ASP.NET MVC中的异步操作却一直显得比较落伍...

a726822058479123的博客 246

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

.NET MVC5自带模板方法功能解析(2)

.NET MVC5自带模板方法功能解析(2)

学习、分享 2506

Asp.net MVC 4 异步方法

前面一篇文章我们介绍了Asp.net MVC 3下异步操作。今天我们来看一下,同样功能在 Asp.net MVC 4 下的实现,基于.net framework 4.5 下的async支持,让我们的代码更加简单,看下面片断代码名叫Index的Action方法: public async Task<ActionResult> IndexAsy...

weixin_30807677的博客 60

ASP.NET MVC 4 路线图

根据微软的年度节奏, 已经开始着手下一个版本的ASP.NET MVC的规划了。其重点领域包括让开发和部署工作流程更平滑,共享更多Web Forms特性,改善对AJAX的支持,并在手机和平板设备为HTML5提供更好的体验。\警告:在这篇文章中提到的功能仍处于规划阶段,未必会出现在最终版本的MVC 4。\Recipes\在开发速度方面,MVC框架缺乏复杂的用户控件是相当不利的。MVC团队正在想办法提供...

cpongo5 148

.NET Framework 4.5 五个很棒的特性

简介 自.NET 4.5发布已经过了差不多1年了。但是随着最近微软大多数的发布,与.NET开发者交流的问题显示,开发者仅知道一到两个特性,其他的特性仅仅停留在MSDN并以简单的文档形式存在着。 比如说,当你问一个.NET开发者.NET框架内核中有什么新东西的时候,他们中的大多数仅仅会说异步与等待(至少和我交谈的人们仅仅谈到了这些特性)。 另外也很难贯通所有的新特性。因为这些特性可能对于你目前

专注企业信息化 323

php如何异步,php的异步处理

异步任务队列Celery在Django中的使用前段时间在Django Web平台开发中,碰到一些请求执行的任务时间较长(几分钟),为了加快用户的响应时间,因此决定采用异步任务的方式在后台执行这些任务.在同事的指引下接触了Celery这个异步任务队 ...C&num;异步编程&lpar;一&rpar;异步编程简介 前言 本人学习.Net两年有余,是第一次写博客,虽然写的很认真...

weixin_31124163的博客 170

在MVC中使用async和await的说明

http://www.cnblogs.com/yeagen/archive/2013/09/22/3334059.html 转载于:https://www.cnblogs.com/tianboblog/p/5464587.html

weixin_30498921的博客 125

async & await 的前世今生(Updated)2014-02-24 08:24 by Jesse Liu,

 async & await 的前世今生(Updated)2014-02-24 08:24 by Jesse Liu async 和 await 出现在C# 5.0之后,给并行编程带来了不少的方便,特别是当在MVC中的Action也变成async之后,有点开始什么都是async的味道了。但是这也给我们编程埋下了一些隐患,有时候可能会产生一些我们自己都不知道怎么产生的Bug,

巴萨,足球的艺术 655

【C# MVC 前置】异步编程 async/await:从 “卡界面” 到 “秒响应” 的 Action 优化指南(附微软官方避坑清单)

文章摘要:本文介绍了async/await在MVC开发中的核心应用,通过线程复用机制解决同步操作导致的界面卡顿问题。文章首先通过流程图对比同步/异步执行差异,说明异步编程如何提高并发能力。随后给出3个典型场景的完整代码实现:1)EF Core异步查询数据库避免线程占用;2)异步处理文件上传与入库;3)HttpClient异步调用第三方接口。关键要点包括:优先使用原生异步方法(如ToListAsync)、正确配置Task返回值类型、避免使用Task.Run包装同步方法等。这些技巧可显著提升MVC应用的响应速度

William_cl的博客 2889
上一篇: NET实现Hadoop增删改查
下一篇: jQuery动画切换效果
.NET跨平台
博客等级 码龄15年 6066粉丝 738原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值