如何使用async / await在asp.net webform中实现异步页面?

时间:2012-03-05 04:27:20

标签: asp.net asynchronous webforms async-await

我们现在可以在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中使用它?

2 个答案:

答案 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; 
}