15

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

4

2 回答 2

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请参阅此 MSDN 论坛主题),但应该适用于其他事件,例如按钮单击。

更新:确实适用Page_Load于 ASP.NET 4.5。此外,他们还添加了检查您是否不正确地使用async事件处理程序。有关详细信息,请参阅此视频。

于 2012-03-05T13:17:51.840 回答
2

根据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; 
}
于 2017-02-04T22:09:22.050 回答