现在我们可以在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
。首先,在@Page
指令中添加Async="true"
参数,然后就可以编写如下的异步事件处理程序:
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论坛线程),但对于其他事件(如按钮点击)应该可以。
更新:在ASP.NET 4.5中,这对于Page_Load
也有效。此外,他们还添加了检查来防止您错误地使用async
事件处理程序。有关详细信息,请参见此视频。
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;
}
async void
不会自动向Page
注册,因此会出现问题(在 .NET 4.0 上)。 - Stephen ClearyTask.Run
的使用(与ContiuneWith
链接且当然不访问Result
以避免死锁),已经存在多年并且没有出现问题。但需要说明的是,同时使用该Task.Run
代码的会话不超过几十个。 - OfirDTask.Run
和ContinueWith
可能有效,但在ASP.NET上,Task.Run
效率低下,而ContinueWith
是一种危险的低级方法。 - Stephen Cleary