2016-04-25 9 views
24

इस जैसे कोड का एक टुकड़ा पर विचार करें:सी # कंपाइलर I/O बाध्य और कम्प्यूटेशनल कार्यों के बीच अंतर कर सकता है?

public async Task<Bitmap> DownloadDataAndRenderImageAsync(
    CancellationToken cancellationToken) 
{ 
    var imageData = await DownloadImageDataAsync(cancellationToken); 
    return await RenderAsync(imageData, cancellationToken); 
} 

इस विधि में चरणों के पहले आई/ओ बाध्य काम है, जहां दूसरे रूप में, कम्प्यूटेशनल।

जब हम इस एसिंक्रोनस ऑपरेशन के लिए सही कार्य-आधारित कोड उत्पन्न करने के लिए कंपाइलर पर भरोसा करते हैं, तो संकलक क्या करता है?

विशेष रूप से, क्या यह पता है कि पहला I/O बाध्य है इसलिए इसे TaskCompletionSource<T> कक्षा का उपयोग करना चाहिए ताकि धागे और कार्य के बीच कोई संबंध न हो, और दूसरे के लिए, यह किसी भी का उपयोग कर सकता है थ्रेड-पूल थ्रेड पर कार्य निर्धारित करने के लिए Run या StartNew या Start जैसी विधियां?

उत्तर

39

नहीं। आपके द्वारा दिए गए उदाहरण में, कंपाइलर केवल समग्र एसिंक्रोनस ऑपरेशन (DownloadDataAndRenderImageAsync) के लिए TaskCompletionSource<T> (परोक्ष रूप से) का उपयोग करेगा। यह उन दो तरीकों पर निर्भर है जिन्हें यह तय करने के लिए कहा जाता है कि वे प्रासंगिक कार्य को वापस कैसे कर रहे हैं।

शायद DownloadImageDataAsync स्वयं async विधि है जो कुछ और async I/O को प्रस्तुत करता है। शायद RenderAsyncTask.Run पर कॉल करें। वे कार्यान्वयन विवरण दोनों हैं कि संकलित करते समय संकलक पर सभी पर ध्यान नहीं देता है।

16

न तो संकलक रनटाइम को नहीं जानता है। वास्तव में पूरे शब्द "आईओ बाध्य" अस्पष्ट रूप से परिभाषित किया गया है। क्या कोई ओएस आईओ कॉल करता है ?! सो रहा है या एक आईओ समय ?!

यदि आपको यह प्रश्न पूछना है तो आपको कार्यों के आसपास कुछ गलतफहमी हो सकती है क्योंकि इसे सामान्य रूप से जानना आवश्यक नहीं है।

शायद यह सोचने में आम त्रुटि है कि प्रतीक्षा एक कार्य शुरू करती है? यह एक मौजूदा कार्य को पूरा करने की प्रतीक्षा करता है। DownloadImageDataAsync और RenderAsync तय करें कि उस कार्य को कैसे और कब पूरा करना है। तो वे तय करते हैं कि सीपीयू का उपयोग करना है या आईओ प्रदर्शन करना है या नहीं।

जब DownloadImageDataAsync और RenderAsync आपको एक ऐसा काम सौंपा जो आपको नहीं पता कि अंदर क्या है और आपको जानने की आवश्यकता नहीं है।

+1

'क्या कोई ओएस आईओ कॉल करता है ?! क्या आईओ सो रहा है या समय है?! हाँ। जिन कार्यों में [साइड इफेक्ट्स] हैं (https://en.wikipedia.org/wiki/Side_effect_ (computer_science)) [शुद्ध] नहीं हैं (https://en.wikipedia.org/wiki/Pure_function), और ऐसा लगता है इस सवाल के इरादे और उद्देश्यों कि आईओ को शुद्धता के साथ उलझाया जा रहा है। – cat

+1

@cat शुद्ध! = नहीं आईओ। भले ही आईओ को सटीक रूप से परिभाषित किया गया हो, और आपकी परिभाषा सार्वभौमिक रूप से स्वीकार नहीं की गई है, सवाल अभी भी है: आईओ - ** बाध्य ** क्या है? कुछ भी 100% आईओ नहीं है। इस तरह के एक अस्पष्ट शब्द। – usr

+1

@usr: और, ज़ाहिर है, एक बार जब आप * इसे * कड़ाई से परिभाषित करते हैं कि सवाल समझ में आता है, तो जवाब यह है कि यह निर्णय हल करना समस्या हल करने के बराबर है। (जो कि फॉर्म के * सभी * प्रश्नों का उत्तर काफी है "क्या कंपाइलर XYZ को अलग कर सकता है"।) –

33

जब हम इस एसिंक्रोनस ऑपरेशन के लिए सही कार्य-आधारित कोड उत्पन्न करने के लिए कंपाइलर पर भरोसा करते हैं, तो संकलक क्या करता है?

उदाहरण में आप संकलक को जानते हैं कि DownloadImageDataAsync और RenderAsync वे विधियां हैं जो प्रतीक्षा करने योग्य हैं। Awaitables वे वस्तुएं हैं जो (1) पूरा होने के लिए पूछताछ की जा सकती हैं, और (2) निरंतरता को पूरा करने के लिए साइन अप किया गया है। कंपाइलर कोड उत्पन्न करता है जो यह पता लगाता है कि लौटाए गए प्रतीक्षा योग्य हैं या नहीं, और यदि वे नहीं हैं, तो प्रतीक्षा के पूरा होने के रूप में शेष विधि को साइन अप करें।

विशेष रूप से, यह पता है कि पहले एक आई/ओ बाध्य

नहीं है। यह जानता है कि यह कुछ इंतजार कर रहा है।

तो यह इतना है कि वहाँ एक धागा और कार्य

के बीच कोई संबंध आप पूरा होने के तर्क के विवरण के बारे में परवाह है, तो आप यह सुनिश्चित करने के लिए जिम्मेदार हैं है TaskCompletionSource वर्ग का उपयोग करना चाहिए कि जिस संदर्भ में प्रतीक्षा होती है वह सही संदर्भ है। यदि आपको परवाह नहीं है, तो आपको एक उचित डिफ़ॉल्ट संदर्भ मिलेगा।

और दूसरे के लिए, यह रन या स्टार्टन्यू जैसी किसी भी विधि का उपयोग कर सकता है या थ्रेड-पूल थ्रेड पर कार्य को शेड्यूल करने के लिए प्रारंभ कर सकता है?

कंपाइलर ऐसी कोई काम नहीं करता है। कंपाइलर कोड उत्पन्न करता है जो जांचता है कि लौटा हुआ प्रतीक्षा पूरा हो गया है, और यदि नहीं, तो प्रतीक्षा करने के पूरा होने पर संकेत मिलता है। कैसे प्रतीक्षा करने योग्य काम कैली की ज़िम्मेदारी है, संकलक नहीं!

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