我们现在可以在 ASP.NET MVC 4 中使用 async/await 关键字。
public async Task<ActionResult> TestAsync()
{
WebClient client = new WebClient();
return Content(await client.DownloadStringTaskAsync("http://www.google.com"));
}
但是如何在 ASP.NET WebForms 中使用它呢?
我们现在可以在 ASP.NET MVC 4 中使用 async/await 关键字。
public async Task<ActionResult> TestAsync()
{
WebClient client = new WebClient();
return Content(await client.DownloadStringTaskAsync("http://www.google.com"));
}
但是如何在 ASP.NET WebForms 中使用它呢?
一种简单的方法是让您的事件处理程序async
。首先,将Async="true"
参数添加到@Page
指令中,然后您应该能够编写异步事件处理程序,如下所示:
protected async void Page_Load(object sender, EventArgs e)
{
var client = new WebClient();
var content = await client.DownloadStringTaskAsync("http://www.google.com");
Response.Write(content);
}
我说“应该能够”是因为我自己还没有真正尝试过。但它应该工作。
更新:这不适用于(Page_Load
请参阅此 MSDN 论坛主题),但应该适用于其他事件,例如按钮单击。
更新:这确实适用Page_Load
于 ASP.NET 4.5。此外,他们还添加了检查您是否不正确地使用async
事件处理程序。有关详细信息,请参阅此视频。
根据http://www.hanselman.com/blog/TheMagicOfUsingAsynchronousMethodsInASPNET45PlusAnImportantGotcha.aspx在 Web 表单中使用异步的唯一可靠方法是调用 Page.RegisterAsyncTask。
支持诸如异步 Page_Load 之类的简单事物的代码非常复杂,并且没有针对基本场景之外的任何内容进行良好测试。
将 async 与 voids 一起使用是不稳定或不可靠的。但是,您所要做的就是调用 Page.RegisterAyncTask - 这没有任何麻烦,您将处于一个更好更灵活的地方
.
public void Page_Load(object sender, EventArgs e)
{
RegisterAsyncTask(new PageAsyncTask(LoadSomeData));
}
public async Task LoadSomeData()
{
var clientcontacts = Client.DownloadStringTaskAsync("api/contacts");
var clienttemperature = Client.DownloadStringTaskAsync("api/temperature");
var contacts = Newtonsoft.Json.JsonConvert.DeserializeObject>(await clientcontacts);
var temperature = Newtonsoft.Json.JsonConvert.DeserializeObject(await clienttemperature);
listcontacts.DataSource = contacts;
listcontacts.DataBind();
Temparature.Text = temperature;
}