2013-01-17 40 views
10

मुझे एक समस्या है जिसमें मुझे पता लगाना प्रतीत नहीं होता है, हालांकि स्टैक ओवरफ्लो पर यहां एक मानक प्रश्न है।लैम्बडा अभिव्यक्ति को 'System.Delegate' टाइप करने के लिए परिवर्तित नहीं कर सकता क्योंकि यह एक प्रतिनिधि प्रकार नहीं है?

मैं (इस एक पुराने सिल्वरलाइट परियोजना से है और WPF में काम करने के लिए नहीं लगता है, मन आप)

_map.Dispatcher.BeginInvoke(() => 
{ 
    _map.Children.Clear(); 
    foreach (var projectedPin in pinsToAdd.Where(pin => PointIsVisibleInMap(pin.ScreenLocation, _map))) 
    { 
     _map.Children.Add(projectedPin.GetElement(ClusterTemplate)); 
    } 
}); 

मैं गलत क्या कर रहा हूँ मेरी बिंग मैप्स अद्यतन करने के लिए एसिंक्रोनस रूप से निम्नलिखित कोड का उपयोग कर कोशिश कर रहा हूँ ?

+6

और '(एक्शन) (() => ...) के बारे में क्या? – acrilige

+0

@acrilige धन्यवाद! आपने इसे जवाब के रूप में क्यों नहीं बनाया ???? –

उत्तर

30

आप यह स्पष्ट रूप से System.Delegate करने के लिए रूपांतरण के लिए क्रम में एक Action को कास्ट करने के लिए में किक करने के लिए है

यही कारण है :

_map.Dispatcher.BeginInvoke((Action)(() => 
{ 
    _map.Children.Clear(); 
    foreach (var projectedPin in pinsToAdd.Where(pin => PointIsVisibleInMap(pin.ScreenLocation, _map))) 
    { 
     _map.Children.Add(projectedPin.GetElement(ClusterTemplate)); 
    } 
})); 
+5

आपकी रूचि के लिए, हो सकता है कि आप अपनी टिप्पणी के लिए एसएलएक्स के उत्तर –

13

BeginInvoke() विधि का पैरामीटर बेस Delegate कक्षा है।

आप केवल एक लैम्ब्डा अभिव्यक्ति को एक ठोस प्रतिनिधि प्रकार में परिवर्तित कर सकते हैं।

इस समस्या को हल करने के लिए, आप स्पष्ट रूप से एक प्रतिनिधि के निर्माण के लिए की जरूरत है:।

BeginInvoke(new MethodInvoker(() => { ... })); 
+10

लिटिल ज्ञात तथ्य: यह 'कार्रवाई'/'थ्रेडस्टार्ट 'इत्यादि के बजाय यहां' विधिInvoker 'का उपयोग करने के लिए थोड़ा सा * अधिक कुशल है - भले ही हस्ताक्षर समान है: इसके पास' Control.InvokeMarshaledCallbackDo' 'के माध्यम से प्रत्यक्ष समर्थन है 'is'/cast) - जहां-जैसे अन्य प्रतिनिधि प्रकार 'डायनामिक इनवोक' का उपयोग करते हैं। एकमात्र अन्य सीधे समर्थित प्रतिनिधि प्रकार 'WaitCallback' और' EventHandler' –

2

प्रयास करें

Dispatcher.BeginInvoke(new System.Threading.ThreadStart(delegate 
{ 
//Do something 
})); 

या एक्शन

+4

में जो टिप्पणी जोड़ूं, उसे देखना चाहें, आप शायद स्लेक्स में जो टिप्पणी जोड़ चुके हैं उसे देखना चाहें 'उत्तर –

+0

http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx: प्रतिनिधि इवेंट हैंडलर का एक उदाहरण हो सकता है, जिस स्थिति में प्रेषक पैरामीटर में यह नियंत्रण होगा, और ईवेंट पैरामीटर EventArgs.Empty शामिल हैं। प्रतिनिधि भी MethodInvoker, या किसी अन्य प्रतिनिधि का उदाहरण हो सकता है जो शून्य पैरामीटर सूची लेता है। इवेंट हैंडलर या मेथडइवॉकर प्रतिनिधि को कॉल किसी अन्य प्रकार के प्रतिनिधि को कॉल से तेज़ होगा। – Alex