Как использовать async/await для достижения асинхронной страницы в веб-форме asp.net?
Теперь мы можем использовать ключевые слова 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?
Ответы
Ответ 1
Один простой способ - просто сделать обработчики событий async
. Сначала добавьте параметр Async="true"
в директиву @Page
, а затем вы сможете написать обработчики событий async как таковые:
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
. Подробнее см. в этом видео.
Ответ 2
В соответствии с http://www.hanselman.com/blog/TheMagicOfUsingAsynchronousMethodsInASPNET45PlusAnImportantGotcha.aspx единственным надежным способом использования async в веб-формах является вызов Page.RegisterAsyncTask.
Код для поддержки простых вещей, таких как async Page_Load, чрезвычайно сложный и недостаточно проверенный для чего-либо помимо основных сценариев.
Использование async с пустотами не является стабильным или надежным. Однако, все, что вы вам нужно позвонить по адресу. PageRegisterAyncTask - это не проблема и вы будете в более гибком месте
.
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;
}