2012-03-05 7 views
12

अब हम async उपयोग कर सकते हैं/ASP.NET MVC 4.asp.net वेबफॉर्म में एसिंक्रोनस पेज प्राप्त करने के लिए async/await का उपयोग कैसे करें?

public async Task<ActionResult> TestAsync() 
{ 
    WebClient client = new WebClient(); 
    return Content(await client.DownloadStringTaskAsync("http://www.google.com")); 
} 

में मुख्य शब्द का इंतजार है लेकिन यह कैसे ASP.NET WebForms में इसका इस्तेमाल करने की?

उत्तर

20

एक आसान तरीका है कि आप अपने ईवेंट हैंडलर async बनाएं। सबसे पहले, @Page निर्देश के लिए Async="true" पैरामीटर जोड़ने, और फिर आप इस तरह के रूप 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 के लिए काम (this MSDN forum thread देखें), लेकिन इस तरह बटन क्लिक के रूप में अन्य घटनाओं के लिए काम करना चाहिए।

अद्यतन: यह ASP.NET 4.5 में Page_Load के लिए काम करता है। साथ ही, यदि आप अनुचित रूप से async ईवेंट हैंडलर का उपयोग करते हैं तो उन्होंने चेक जोड़े। See this video for details.

+0

और मैंने कोशिश की है, यह काम नहीं करता है। – Dozer

+0

यह सही ढंग से काम करता है! – Dozer

+0

यदि प्रतीक्षा कीवर्ड पेज_लोड में एसिंक्रोनस ऑपरेशन के बारे में पृष्ठ क्लास को अधिसूचित नहीं कर रहा था तो बटन क्लिक के लिए यह अलग क्यों होगा? लेकिन अद्यतन के लिए धन्यवाद कि यह अब समर्थित है। – Michael

1

http://www.hanselman.com/blog/TheMagicOfUsingAsynchronousMethodsInASPNET45PlusAnImportantGotcha.aspx के अनुसार वेब रूपों में एसिंक का उपयोग करने का एकमात्र विश्वसनीय तरीका पृष्ठ पर कॉल करना है। रजिस्ट्रेशन एसिंक टास्क।

एसिंक पेज_लोड जैसे साधारण चीजों का समर्थन करने के लिए कोड बेहद जटिल परिदृश्यों से परे किसी भी चीज़ के लिए जटिल और अच्छी तरह से परीक्षण नहीं किया गया है।

voids के साथ async का उपयोग स्थिर या भरोसेमंद नहीं है। यह किसी भी मुसीबत नहीं है और आप एक बेहतर और अधिक लचीला जगह

में हो जाएगा - हालांकि, तुम सब करने की है फोन Page.RegisterAyncTask है।

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; 
} 
संबंधित मुद्दे

 संबंधित मुद्दे