2013-03-12 6 views
7

मैं नेट 4.0+ टास्क समानांतर लाइब्रेरी अवधारणाओं की समझ पाने के लिए कोशिश कर रहा हूँ ...कार्य की परिणाम संपत्ति गैर-सामान्य कार्य (सी # 4.0+) के लिए अनुपलब्ध क्यों है?

निम्नलिखित सी # 4.0 कोड स्निपेट में:

Task t = Task.Factory.StartNew(() => 
{ 
    Console.WriteLine("I am the task"); 
    return "res1"; 
}); 

क्यों संकलक नहीं है (और रन-टाइम या तो) यदि किसी भी कार्य का उपयोग नहीं किया जाता है तब तक वापसी का उपयोग नहीं किया जा सकता है:

Task<string> t = Task.Factory.StartNew(() => 
{ 
    Console.WriteLine("I am the task"); 
    return "res1"; 
}); 

या यह (लौटा ऑब्जेक्ट) का उपयोग किया जा सकता है?

क्या मैं सही ढंग से समझता हूं कि <string>Task<string> में केवल वापसी प्रकार (एड ऑब्जेक्ट) या t.Result का पता लगाने या आश्वस्त करने के लिए आवश्यक है?
या इसके अलावा मुझे कोई अन्य छुपाएं हैं?

इस प्रकार को लौटाई गई वस्तु के प्रकार से निर्धारित नहीं किया जा सकता है?
आईई। गैर-जेनेरिक कार्यों के लिए एक कार्य की परिणाम संपत्ति अनुपलब्ध क्यों है?

उत्तर

16

गैर सामान्य Task क्योंकि यह एक प्रक्रिया है कि नहीं एक परिणाम के उत्पादन का प्रतिनिधित्व करता है एक Result संपत्ति नहीं है।

आपका कोड दोनों ही मामलों में एक Task<string> बनाता है, लेकिन पहले मामले में आप इसे एक Task लिए डाली (Task<string>, Task से निकला है ताकि कानूनी है) और इसलिए आप परिणाम का उल्लेख करने की क्षमता खो देते हैं। Task से

Task t = Task.Factory.StartNew(() => 
{ 
    Console.WriteLine("I am the task"); 
    return "res1"; 
}); 

var genericTask = t as Task<string>; // genericTask will be non-null 
var result = genericTask.Result;  // and you can access the result 
+0

हां, मैंने इसे देखा लेकिन मुझे समझ में नहीं आया कि क्यों गैर-सामान्य कार्य में 'परिणाम' संपत्ति नहीं हो सकती है – Fulproof

+1

@ फ़ुलप्रूफ यह वैचारिक बात है। 'टास्क 'एसिंक/टास्क वर्ल्ड में' शून्य' रिटर्न प्रकार के बराबर वैचारिक रूप से समतुल्य है, जबकि 'कार्य '' टी' रिटर्न प्रकार के बराबर है। अब, एक विधि 'शून्य फू() 'दिया गया है, आप' var result = Foo(); ',' करने की कोशिश नहीं करेंगे? :) –

+0

क्यों, गैर-जेनेरिक कार्य "गतिविधि" से वापस लौटने से संकलक द्वारा त्रुटि या चेतावनी के रूप में भ्रमित नहीं किया जाता है? – Fulproof

-1

Task<T> संभालते हैं:

आप सीधे इनके साथ देख सकते हैं। दोनों स्थितियों में आप वास्तव में Task<T> बना रहे हैं, लेकिन पहले मामले में आप इसे Task पर कास्टिंग कर रहे हैं, जिसमें Result संपत्ति नहीं है।

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