Подтвердить что ты не робот

Как использовать 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?

4b9b3361

Ответ 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; 
}