2012-03-05 9 views

cevap

20

kolay yollarından biri, sadece olay işleyicileri async yapmaktır. Birincisi, @Page yönergesine Async="true" parametre eklemek ve sonra gibi zaman uyumsuz olay işleyicileri yazma gerekir: Aslında kendim denemedim "gerekir" çünkü

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

. Ama işe yaramalı.

Güncelleme: Bu does değil Page_Load için işi (this MSDN forum thread bakınız), ancak bu tür düğme tıklamak gibi diğer etkinlikler için çalışmalıdır.

Güncelleme: Bu ASP.NET 4.5 Page_Load için çalışır. Ayrıca, async olay işleyicisini uygunsuz şekilde kullanıp kullanmadığınızı denetler. http://www.hanselman.com/blog/TheMagicOfUsingAsynchronousMethodsInASPNET45PlusAnImportantGotcha.aspx Web formlarını zaman uyumsuz kullanmak için tek güvenilir yolu göre

+0

Ve ben bunu denedim, o işe yaramaz. – Dozer

+0

Doğru çalışıyor! – Dozer

+0

bekliyor anahtar kelimenin o düğme tıklama için farklı olsun ki neden Page_Load asenkron operasyon hakkında Sayfa sınıfını bildiren olmasaydım? Ancak, bunun şu anda desteklendiği güncelleştirme için teşekkürler. – Michael

1

See this video for details. Page.RegisterAsyncTask aramak.

zaman uyumsuz Page_Load gibi basit şeyler desteklemek için kod son derece karmaşık ve temel senaryolar ötesinde bir şey için iyi sınanmış değil.

boşlukları ile uyumsuz kullanarak stabil ve güvenilir değildir. Daha iyi bir daha esnek bir yerde

olacağım herhangi sorun olmayacaksa ve - Ancak, yapmanız gereken tüm Page.RegisterAyncTask aramak.

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; 
} 
İlgili konular