2011-12-14 12 views
32

मैं हाल ही में ऑब्जेक्टिव-सी देश में किया जा रहा से सी # करने के लिए वापस स्थानांतरित कर दिया है, और async/5 नज़र शांत सी # में कीवर्ड का इंतजार है। लेकिन मैं अभी भी उचित वाक्यविन्यास पर एक संभाल पाने की कोशिश कर रहा हूं।एसिंक प्रतिनिधि को पास करने के लिए विधि हस्ताक्षर क्या है?

मैं एक विधि है कि एक पैरामीटर के रूप एक अतुल्यकालिक प्रतिनिधि लेता घोषित करने के लिए चाहते हैं, लेकिन मैं मुसीबत दोनों फोन करने वाले और कॉल प्राप्त करने वाला वाक्य रचना सही हो रही हो रहा है। क्या कोई विधि घोषणा, कॉल, और प्रतिनिधि को कॉल दिखाते हुए एक कोड नमूना प्रदान कर सकता है?

मैं सोच रहा हूँ घोषणा निम्नलिखित की तरह कुछ होगा। ध्यान दें कि यह फ़ंक्शन असीमित नहीं है; यानी इसकी असीमता प्रतिनिधि से स्वतंत्र है।

void DoSomethingWithCallback(async delegate foo(int)) 
{ 
    ... 
    foo(42); 
    ... 
} 
कुछ

कॉल होगा जैसे:

DoSomethingWithCallback(async (int x) => { this.SomeProperty = await SomeAsync(x); }); 
इस के पाठ्यक्रम कोई भी

संकलित और नमूने मुझे लगता है कि एक एक क्षेत्र है या संपत्ति प्रतिनिधि है कि, बजाय देखा है की सबसे अधिक अज्ञात प्रतिनिधि मैं उपयोग करना चाहता हूं।

+0

जैसा कि मैं कह सकता हूं, एक प्रतिनिधि इनलाइन निर्दिष्ट करने का कोई तरीका नहीं है, जैसा कि मैंने ऊपर दिए गए प्रश्न में किया है। एक विधि पैरामीटर के रूप में एक प्रतिनिधि का उपयोग करने के लिए, एक प्रतिनिधि प्रकार को वर्ग के दायरे के बाहर घोषित करने की आवश्यकता है। – AndrewS

उत्तर

47

एक फ़ंक्शन जो पैरामीटर के रूप में प्रतिनिधि को लेता है, एक नामित प्रतिनिधि प्रकार का उपयोग करना चाहिए; उद्देश्य-सी के विपरीत आप फ़ंक्शन परिभाषा में एक अज्ञात प्रतिनिधि प्रकार की इनलाइन घोषित नहीं कर सकते हैं। हालांकि, जेनेरिक एक्शन <> और Func <> प्रदान किए जाते हैं ताकि आपको स्वयं को एक नया प्रकार घोषित न करना पड़े। नीचे दिए गए कोड मैं प्रतिनिधि संभालने कर रहा हूँ में एक भी int एक पैरामीटर के रूप लेता है।

void DoSomethingWithCallback(Func<int,Task> callbackDelegate) 
{ 
    Task t = callbackDelegate(42); 
} 

इस समारोह नहीं वास्तव में साथ टास्क वस्तु (ऊपर दिखाए गए कोड के साथ के रूप में) लौट आए कुछ भी करता है, तो आप के बजाय Action<int> प्रतिनिधि प्रकार के रूप में उपयोग कर सकते हैं। यदि आप एक्शन का उपयोग करते हैं, तो आप अभी भी प्रतिनिधि एसिंक (नीचे) घोषित कर सकते हैं लेकिन लौटाए गए निहित कार्य ऑब्जेक्ट को अनदेखा किया जाता है।

ऊपर समारोह फोन करने के लिए लैम्ब्डा वाक्यविन्यास सीधा है और वाक्य रचना आप प्रश्न में इस्तेमाल सही है। ध्यान दें कि पैरामीटर प्रकार यहाँ निर्दिष्ट करने के बाद से यह निष्कर्ष निकाला जा सकता की जरूरत नहीं है:

DoSomethingWithCallback(async (intParam) => { this.myint = await Int2IntAsync(intParam); }); 

तुम भी, एक विधि पारित या चर प्रतिनिधि, यदि आप चाहें तो कर सकते हैं बजाय लैम्ब्डा सिंटैक्स का उपयोग की:

async Task MyInt2Int(int p) { ... } 
Func<int,Task> myDelegate; 
void OtherMethod() 
{ 
    myDelegate = MyInt2Int; 
    DoSomethingWithCallback(myDelegate); // this ... 
    DoSomethingWithCallback(MyInt2Int); // ... or this. 
} 
5

विधि हस्ताक्षर का वापसी प्रकार Task है यदि कोई वापसी प्रकार नहीं है, या Task<T> यदि कोई रिटर्न प्रकार है।

यद्यपि, मैं 100% कुछ आप ऐसा async lambdas हो सकता है अगर नहीं हूँ।

कार्य को पूरा करने वाली विधि में, आप या तो कार्य का इंतजार करेंगे या परिणाम प्राप्त करने के लिए कार्य पर गुणों और विधियों का उपयोग करेंगे।

+10

हां, हम async lambdas का समर्थन कर रहे हैं। अगर मैं खुद ऐसा कहूं तो बहुत चालाक। –

+0

@Eric: वास्तव में बहुत चालाक, वास्तव में। –

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