asp.net mvc 中使用async/await异步编程

本文介绍了在ASP.NET MVC中使用async/await进行异步编程时遇到的问题及其解决方案,包括如何正确配置异步页面,使用Task.WhenAll并行执行多个异步操作,以及如何实现异步操作的取消和避免修改返回类型。
摘要由CSDN通过智能技术生成

已经介绍过async/await异步编程,但是按照一般的异步编程的步骤,在asp.net mvc页面中使用异步编程好像会经常报一个错误,错误信息如下:

现在无法开始异步操作。异步操作只能在异步处理程序或模块中开始,或在页生存期中的特定事件过程中开始。如果此异常在执行 Page 时发生,请确保 Page 标记为 <%@ Page Async="true" %>。此异常也可能表明试图调用“异步无效”方法,在 ASP.NET 请求处理内一般不支持这种方法。相反,该异步方法应该返回一个任务,而调用方应该等待该任务。

在asp.net mvc中调用async/await异步编程编程的示例如下:

在DownLoadTest类中的代码如下:

Stopwatch watch = new Stopwatch();
public DownLoadTest()
{
    watch.Start();
}
public async Task<string> DownLoadStringTaskAsync(string url)
{
    Debug.WriteLine(string.Format("异步程序获取{0}开始运行:{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds));
    WebClient wc = new WebClient();
    string str = await wc.DownloadStringTaskAsync(url);
    Debug.WriteLine(string.Format("异步程序获取{0}运行结束:{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds));
    return str;
}

在asp.net mvc的HomeController控制器中的代码如下:

public ActionResult DownLoad()
{
    DownLoadTest dwtest = new DownLoadTest();
    var task1 = dwtest.DownLoadStringTaskAsync("https://stackoverflow.com/");
    var task2 = dwtest.DownLoadStringTaskAsync("https://github.com/");
    Debug.WriteLine("task.Result等待结果打印");
    task1.Wait();
    task2.Wait();
    Debug.WriteLine("task1.Result.Length=" + task1.Result.Length);
    Debug.WriteLine("task2.Result.Length=" + task2.Result.Length);
    return Json(new { task1Status = task1.Status, task2Status = task2.Status }, JsonRequestBehavior.AllowGet);
}

运行上面的代码,访问/home/DownLoad会报错


报错的代码就是上面的报错信息。查看Output窗口的调试信息,可以看到如下的输出:

异步程序获取https://stackoverflow.com/开始运行:   1ms
异步程序获取https://github.com/开始运行:  42ms
task.Re
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值