2012-03-05 11 views

Respuesta

20

Una forma sencilla es simplemente hacer que sus controladores de eventos async. En primer lugar, agregue el parámetro Async="true" a la directiva @Page, y entonces usted debe ser capaz de escribir controladores de eventos asincrónicos tales como:

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); 
} 

digo "debe ser capaz de" porque no he hecho probado esto por mí mismo . Pero debería funcionar

Actualización: Esto hace no trabajo para Page_Load (ver this MSDN forum thread), pero debería funcionar para otros eventos, tales como pulsaciones de botón.

Actualización: Esto hace trabajo para Page_Load en ASP.NET 4.5. Además, agregaron comprobaciones si usa incorrectamente un controlador de eventos async. See this video for details.

+0

Y lo he intentado, no funciona. – Dozer

+0

¡Funciona correctamente! – Dozer

+0

Si la palabra clave await no notificaba a la clase Page sobre la operación asíncrona en Page_Load, ¿por qué sería diferente para los clics de botón? Pero gracias por la actualización que ahora es compatible. – Michael

1

De acuerdo con http://www.hanselman.com/blog/TheMagicOfUsingAsynchronousMethodsInASPNET45PlusAnImportantGotcha.aspx la única forma confiable de usar asincronía en formularios web es llamar a Page.RegisterAsyncTask.

El código para apoyar cosas simples como Load asíncrono es extremadamente complicado y no bien probada para cualquier cosa más allá de los escenarios básicos.

El uso de la función asíncrona con vacíos no es estable ni confiable. Sin embargo, todo lo que tiene que hacer es llamar Page.RegisterAyncTask - no es ningún problema y vas a estar en un lugar mejor más flexible

.

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; 
} 
Cuestiones relacionadas