2012-03-05 30 views

Trả lời

20

Một cách dễ dàng là chỉ cần xử lý sự kiện của bạn async. Đầu tiên, thêm tham số Async="true" để chỉ thị @Page, và sau đó bạn sẽ có thể viết async xử lý sự kiện như vậy:

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

tôi nói "sẽ có thể" bởi vì tôi đã không thực sự cố gắng này ra bản thân mình . Nhưng nó sẽ hoạt động.

Cập nhật: này không không làm việc cho Page_Load (xem this MSDN forum thread), nhưng nên làm việc cho các sự kiện khác như nhấp chuột vào nút.

Cập nhật:làm làm việc cho Page_Load trong ASP.NET 4.5. Ngoài ra, họ đã thêm kiểm tra nếu bạn sử dụng không đúng cách xử lý sự kiện async. See this video for details.

+0

Và tôi đã thử nó, nó không hoạt động. – Dozer

+0

Nó hoạt động chính xác! – Dozer

+0

Nếu từ khóa chờ đợi không thông báo cho lớp Page về hoạt động không đồng bộ trong Page_Load tại sao điều này lại khác với các lần nhấp nút? Nhưng cảm ơn cho bản cập nhật rằng điều này bây giờ được hỗ trợ. – Michael

1

Theo http://www.hanselman.com/blog/TheMagicOfUsingAsynchronousMethodsInASPNET45PlusAnImportantGotcha.aspx cách đáng tin cậy duy nhất để sử dụng không đồng bộ trong biểu mẫu web là gọi Page.RegisterAsyncTask.

Mã để hỗ trợ những thứ đơn giản như không đồng nhất Page_Load cực kỳ phức tạp và không được kiểm tra tốt cho bất kỳ điều gì ngoài kịch bản cơ bản.

Sử dụng đồng bộ hóa với khoảng trống không ổn định hoặc đáng tin cậy. Tuy nhiên, tất cả các bạn phải làm là gọi Page.RegisterAyncTask - nó không phải bất kỳ rắc rối và bạn sẽ ở một nơi linh hoạt hơn tốt hơn

.

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; 
} 
Các vấn đề liên quan