इस जैसे कोड का एक टुकड़ा पर विचार करें:सी # कंपाइलर 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
जैसी विधियां?
'क्या कोई ओएस आईओ कॉल करता है ?! क्या आईओ सो रहा है या समय है?! हाँ। जिन कार्यों में [साइड इफेक्ट्स] हैं (https://en.wikipedia.org/wiki/Side_effect_ (computer_science)) [शुद्ध] नहीं हैं (https://en.wikipedia.org/wiki/Pure_function), और ऐसा लगता है इस सवाल के इरादे और उद्देश्यों कि आईओ को शुद्धता के साथ उलझाया जा रहा है। – cat
@cat शुद्ध! = नहीं आईओ। भले ही आईओ को सटीक रूप से परिभाषित किया गया हो, और आपकी परिभाषा सार्वभौमिक रूप से स्वीकार नहीं की गई है, सवाल अभी भी है: आईओ - ** बाध्य ** क्या है? कुछ भी 100% आईओ नहीं है। इस तरह के एक अस्पष्ट शब्द। – usr
@usr: और, ज़ाहिर है, एक बार जब आप * इसे * कड़ाई से परिभाषित करते हैं कि सवाल समझ में आता है, तो जवाब यह है कि यह निर्णय हल करना समस्या हल करने के बराबर है। (जो कि फॉर्म के * सभी * प्रश्नों का उत्तर काफी है "क्या कंपाइलर XYZ को अलग कर सकता है"।) –