有时候做一些耗时操作时,不能让用户等太久,这个时候就可以选择异步方法。
对于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统计范围日期"; });
}
如果不使用异步方法,在执行这个耗时过程中网页是被锁死的,如果使用异步执行,此时网页可以做其他操作,而此方法仍会执行。
下面附上一片博客园的园友一篇更详细的介绍。