我们现在可以在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中使用它?
答案 0 :(得分:22)
一种简单的方法就是制作事件处理程序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
(请参阅this MSDN forum thread),但应该适用于其他事件,例如按钮点击。< / p>
更新:此 适用于ASP.NET 4.5中的Page_Load
。此外,如果您不正确地使用async
事件处理程序,他们会添加检查。 See this video for details.
答案 1 :(得分:1)
根据http://www.hanselman.com/blog/TheMagicOfUsingAsynchronousMethodsInASPNET45PlusAnImportantGotcha.aspx,在Web表单中使用async的唯一可靠方法是调用Page.RegisterAsyncTask。
支持像async Page_Load这样的简单事物的代码非常多 对于基本场景之外的任何事情都很复杂且没有经过充分测试。
使用与空隙的异步不稳定或不可靠。但是,你们所有人 要做的就是调用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;
}