एरिक लिपर्ट का एक उत्कृष्ट उत्तर है; मैं सिर्फ थोड़ा सा आगे async
समांतरता का वर्णन करना चाहता था। इस उदाहरण में
static void Process()
{
Thread.Sleep(100); // Do CPU work.
}
static async Task Test()
{
await Task.Run(Process);
await Task.Run(Process);
}
, Test
विधि थ्रेड पूल के लिए Process
कतार होगा, और इसके पूर्ण होने पर, यह:
सरल "धारावाहिक" दृष्टिकोण जहां await
सिर्फ एक एक समय में बात है कतार Process
फिर से थ्रेड पूल में। Test
विधि ~ 200ms के बाद पूरा हो जाएगी। किसी भी समय, केवल एक धागा वास्तव में आगे बढ़ रहा है। दो बार
static void Process()
{
Thread.Sleep(100); // Do CPU work.
}
static async Task Test()
{
// Start two background operations.
Task task1 = Task.Run(Process);
Task task2 = Task.Run(Process);
// Wait for them both to complete.
await Task.WhenAll(task1, task2);
}
इस उदाहरण में, Test
विधि कतारों Process
थ्रेड पूल के लिए, और फिर पूरा करने के लिए उन दोनों के लिए इंतजार कर रहा है:
इस parallelize करने के लिए एक आसान तरीका Task.WhenAll
उपयोग करने के लिए है। Test
विधि ~ 100ms के बाद पूरा हो जाएगी।
Task.WhenAll
(और Task.WhenAny
) के साथ async
/await
सरल समानांतरवाद समर्थन करने के लिए शुरू किए गए थे। हालांकि, टीपीएल अभी भी वहां है यदि आपको कुछ और उन्नत की जरूरत है (असली सीपीयू-बाध्य समांतर प्रसंस्करण टीपीएल के लिए बेहतर फिट है)। टीपीएल async
/await
के साथ अच्छी तरह से खेलता है।
मैं अपने into to async
blog post में मूल async
समांतरता को कवर करता हूं, साथ ही "संदर्भ" जिसे एरिक ने बताया है।
स्रोत
2012-03-28 00:13:46
यह एसिंक विधि द्वारा लौटाई जाने वाली प्रतीक्षा योग्य वस्तु पर निर्भर करता है। – phoog
न तो। वे सिर्फ वाक्यविन्यास चीनी हैं। थ्रेडिंग वर्तमान 'सिंक्रनाइज़ेशन कॉन्टेक्स्ट' और' टास्क 'पर निर्भर करता है जिसका आप इंतजार कर रहे हैं। – CodesInChaos