【发布时间】:2023-03-11 21:28:01
【问题描述】:
我有一个非常简单的 ASP.NET MVC 4 控制器:
public class HomeController : Controller
{
private const string MY_URL = "http://smthing";
private readonly Task<string> task;
public HomeController() { task = DownloadAsync(); }
public ActionResult Index() { return View(); }
private async Task<string> DownloadAsync()
{
using (WebClient myWebClient = new WebClient())
return await myWebClient.DownloadStringTaskAsync(MY_URL)
.ConfigureAwait(false);
}
}
当我启动项目时,我看到了我的视图,它看起来不错,但是当我更新页面时,我收到以下错误:
[InvalidOperationException:异步模块或处理程序已完成,而异步操作仍处于挂起状态。]
为什么会这样?我做了几个测试:
- 如果我们从构造函数中删除
task = DownloadAsync();并将其放入Index方法中,它将正常工作而不会出现错误。 - 如果我们使用另一个
DownloadAsync()bodyreturn await Task.Factory.StartNew(() => { Thread.Sleep(3000); return "Give me an error"; });它将正常工作。
为什么不能在控制器的构造函数中使用WebClient.DownloadStringTaskAsync方法?
【问题讨论】:
标签: c# .net asp.net-mvc-4 async-await webclient