मैं सी # की (और वीबी का) नई async सुविधाओं के बीच अलग नहीं दिख रहा है, और .NET 4.0 के Task Parallel Library। उदाहरण के लिए ले लो,, एरिक Lippert के कोड from here:सी # 5.0 की एसिंक-प्रतीक्षा सुविधा टीपीएल से अलग कैसे होती है?
async void ArchiveDocuments(List<Url> urls) {
Task archive = null;
for(int i = 0; i < urls.Count; ++i) {
var document = await FetchAsync(urls[i]);
if (archive != null)
await archive;
archive = ArchiveAsync(document);
}
}
ऐसा नहीं है कि await
कीवर्ड दो विभिन्न प्रयोजनों की सेवा कर रहा है लगता है। पहली घटना (FetchAsync
) मतलब करने के लिए, लगता है "यह मान विधि में बाद में प्रयोग किया जाता है और अपने कार्य को पूरा नहीं हुआ है, तो इंतजार जब तक यह जारी रखने से पहले पूरा करती है।" दूसरे उदाहरण (archive
) मतलब करने के लिए, "इस कार्य को अभी तक पूरी नहीं हुई है, तो इंतजार अभी जब तक यह पूरा करता है।" लगता है यदि मैं गलत हूं, तो कृपया मुझे सही करें।
यह बस के रूप में आसानी से इस तरह लिखा नहीं जा सकता है?
void ArchiveDocuments(List<Url> urls) {
for(int i = 0; i < urls.Count; ++i) {
var document = FetchAsync(urls[i]); // removed await
if (archive != null)
archive.Wait(); // changed to .Wait()
archive = ArchiveAsync(document.Result); // added .Result
}
}
मैं एक Task.Result
जहां मूल्य वास्तव में जरूरत है, और दूसरा await
Task.Wait()
साथ, जहां इंतजार वास्तव में हो रहा है के साथ पहली await
से बदल दिया है। कार्यक्षमता (1)
पहले से ही लागू किया, और (2)
बहुत करीब क्या वास्तव में कोड में हो रहा है के लिए अर्थ की दृष्टि से है।
मुझे एहसास है कि async
विधि को राज्य मशीन के रूप में फिर से लिखा जाता है, इटेटरेटर्स के समान, लेकिन मुझे यह भी नहीं दिखता कि कौन से लाभ लाते हैं। कोई भी कोड जिसके लिए किसी अन्य धागे को संचालित करने की आवश्यकता होती है (जैसे डाउनलोड करना) को अभी भी एक और थ्रेड की आवश्यकता होगी, और कोई भी कोड जो फ़ाइल (जैसे फ़ाइल से पढ़ना) नहीं करता है, अभी भी टीपीएल को केवल एक थ्रेड के साथ काम करने के लिए उपयोग कर सकता है।
मैं स्पष्ट रूप से यहाँ कुछ विशाल याद कर रहा हूँ; क्या कोई मुझे थोड़ा बेहतर समझने में मदद कर सकता है?
भी देखें http://stackoverflow.com/questions/3513432/task-parallel-library-replacement-for-backgroundworker:
क्या इंतजार कोड के बिना 'का इंतजार है' इस उत्कृष्ट लिंक देखें कैसा दिखेगा देखने के लिए ? lq = 1 और http://stackoverflow.com/questions/12414601/async-await-vs-backgroundworker?lq=1 – nawfal
इस लिंक को देखें जिसमें साफ उदाहरण हैं: http://richnewman.wordpress.com/2012/12/03/ट्यूटोरियल-एसिंक्रोनस-प्रोग्रामिंग-एसिंक-एंड-प्रतीक्षा-के-शुरुआती/ – nawfal