Как использовать async / await для достижения асинхронной страницы в веб-форме asp.net? - PullRequest
14 голосов
/ 05 марта 2012

Теперь мы можем использовать ключевые слова async / await в ASP.NET MVC 4.

public async Task<ActionResult> TestAsync()
{
    WebClient client = new WebClient();
    return Content(await client.DownloadStringTaskAsync("http://www.google.com"));
}

Но как использовать его в ASP.NET WebForms?

Ответы [ 2 ]

22 голосов
/ 05 марта 2012

Один простой способ - просто сделать ваши обработчики событий 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. Подробности смотрите в этом видео.

1 голос
/ 05 февраля 2017

Согласно http://www.hanselman.com/blog/TheMagicOfUsingAsynchronousMethodsInASPNET45PlusAnImportantGotcha.aspx единственный надежный способ использования асинхронности в веб-формах - это вызов 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; 
}
...