2012-03-05 10 views

risposta

20

Un modo semplice è quello di rendere i gestori di eventi solo async. In primo luogo, aggiungere il parametro Async="true" alla direttiva @Page, e allora si dovrebbe essere in grado di scrivere i gestori di eventi asincroni in quanto tale:

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

Dico "dovrebbe essere in grado di" perché non ho davvero provato questo io stesso . Ma dovrebbe funzionare.

Aggiornamento: Questo fa non lavoro per Page_Load (vedi this MSDN forum thread), ma dovrebbe funzionare per altri eventi come i clic sui pulsanti.

Aggiornamento: Questo fa lavoro per Page_Load in ASP.NET 4.5. Inoltre, hanno aggiunto dei controlli se si utilizza erroneamente un gestore di eventi async. See this video for details.

+0

E l'ho provato, non funziona. – Dozer

+0

Funziona correttamente! – Dozer

+0

Se la parola chiave await non stava notificando la classe Page sull'operazione asincrona in Page_Load, perché ciò sarebbe diverso per i clic sui pulsanti? Ma grazie per l'aggiornamento che questo è ora supportato. – Michael

1

Secondo http://www.hanselman.com/blog/TheMagicOfUsingAsynchronousMethodsInASPNET45PlusAnImportantGotcha.aspx, l'unico modo affidabile per utilizzare async nei moduli Web è chiamare Page.RegisterAsyncTask.

Il codice per supportare cose semplici come async Page_Load è estremamente complicato e non ben collaudato per qualcosa oltre gli scenari di base.

L'utilizzo di async con vuoti non è stabile o affidabile. Tuttavia, tutto ciò che che dovete fare è chiamare Page.RegisterAyncTask - non è alcun problema e sarete in un posto migliore più flessibile

.

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; 
} 
Problemi correlati