दो अच्छा पहले से ही जवाब नहीं है, लेकिन जोड़ने के लिए मेरी 0.02 ...
आप के बारे में के लिए दोनों आई/ओ बाध्य और CPU- बात कर रहे हैं लेने वाली अतुल्यकालिक संचालन, async
/await
काम करता है उत्कृष्ट बाध्य।
मुझे लगता है कि MSDN डॉक्स जिस स्थिति में आप के लिए मैं/हे बाध्य और TaskCompletionSource
(या समान) उपयोग करना चाहते हैं, अतुल्यकालिक संचालन के उत्पादन की दिशा में एक मामूली तिरछा है Task.Run
(या समान) सीपीयू बाध्य के लिए ।एक बार जब आपने शुरुआती Task
रैपर बनाया है, तो यह async
और await
द्वारा उपभोग किया गया है।
आपके विशेष उदाहरण के लिए, यह वास्तव में नीचे आता है कि LoadHtmlDocument
कितना समय लगेगा। यदि आप Task.Run
हटाते हैं, तो आप इसे उसी संदर्भ में निष्पादित करेंगे जो LoadPage
(संभवतः यूआई थ्रेड पर) को कॉल करता है। विंडोज 8 दिशानिर्देश बताते हैं कि 50 एमएमएस से अधिक लेने वाले किसी भी ऑपरेशन को async
बनाया जाना चाहिए ... ध्यान रखें कि आपकी डेवलपर मशीन पर 50 एमएमएस ग्राहक की मशीन पर अधिक हो सकता है ...
तो यदि आप गारंटी दे सकते हैं कि LoadHtmlDocument
कम से कम 50ms के लिए चलाने के लिए, तुम सिर्फ यह सीधे निष्पादित कर सकते हैं:
public async Task<HtmlDocument> LoadPage(Uri address)
{
using (var httpResponse = await new HttpClient().GetAsync(address)) //IO-bound
using (var responseContent = httpResponse.Content)
using (var contentStream = await responseContent.ReadAsStreamAsync()) //IO-bound
return LoadHtmlDocument(contentStream); //CPU-bound
}
हालांकि, मैं ConfigureAwait
सिफारिश करेंगे @svick रूप में उल्लेख किया:
public async Task<HtmlDocument> LoadPage(Uri address)
{
using (var httpResponse = await new HttpClient().GetAsync(address)
.ConfigureAwait(continueOnCapturedContext: false)) //IO-bound
using (var responseContent = httpResponse.Content)
using (var contentStream = await responseContent.ReadAsStreamAsync()
.ConfigureAwait(continueOnCapturedContext: false)) //IO-bound
return LoadHtmlDocument(contentStream); //CPU-bound
}
ConfigureAwait
साथ
, अगर टी वह HTTP अनुरोध तत्काल (सिंक्रनाइज़) पूरा नहीं होता है, तो यह पर एक स्पष्ट कॉल के बिना थ्रेड पूल थ्रेड पर निष्पादित करने के लिए LoadHtmlDocument
का कारण होगा (इस मामले में)।
यदि आप इस स्तर पर async
प्रदर्शन में रुचि रखते हैं, तो आपको इस विषय पर स्टीफन टब के video और MSDN article पर ध्यान देना चाहिए। उसके पास बहुत उपयोगी जानकारी है।