Bootstrap

.NET MVC中的同步和异步

有时候做一些耗时操作时,不能让用户等太久,这个时候就可以选择异步方法。

对于MVC来说,可以选择控制器中添加异步方法或者AJAX中选择异步执行。

首先来说AJAX中设置 async: true

           $("#btnExportKPI").click(function () {
            var data1 = $("#sysDate1").val();
            var data2 = $("#sysDate2").val();
            $.ajax({
                url: "/现金管理账户表/ExportKPI1",
                //data: $("#form").serialize(),
                async: true,
                data: { "data1": data1, "data2": data2 },
                datatype: "json",
                type: "get",
                success: function (data) {
                    if (data) {
                        if (data.length > 100)
                            location.href = "/Account/AuthorizeFail";
                        else
                            location.href = "../../Excels/Common/" + data;
                    }
                    else {
                        alert("没有查询到任何数据.");
                    }
                }              
            });
                alert("数据导出中,请稍候...");
        });

默认async为true,意思是按异步执行,此时URL中的方法和success以及下面alert("数据导出中,请稍候...");几乎是同时执行的。

当设置async为false时,选择同步执行,此时 URL中的方法执行完毕才会执行success方法,然后才是alert("数据导出中,请稍候...");

然后来说控制器中的异步方法

异步方法用 async来修饰,同时搭配 await 来使用,返回类型为Task<T>,比如

        public async Task<string> ExportKPI1(string data1, string data2)
        {
            var fileName = await ExportKPI2(data1, data2);
            return "../../Excels/Common/" + fileName;
        }

        public Task<string> ExportKPI2(string data1, string data2)
        {
        return  new Task<string>(() => { return "请选择KPI统计范围日期"; });
        }

如果不使用异步方法,在执行这个耗时过程中网页是被锁死的,如果使用异步执行,此时网页可以做其他操作,而此方法仍会执行。

下面附上一片博客园的园友一篇更详细的介绍。

https://www.cnblogs.com/wyy1234/p/9172467.html#_label1_2

;