2012-03-03 10 views
42

न तो इन काम के लैम्ब्डा अभिव्यक्ति कनवर्ट नहीं कर सकता:टाइप करने के लिए 'System.Delegate'

_uiDispatcher.Invoke(() => { }); 
_uiDispatcher.Invoke(delegate() { }); 

सभी मैं करना चाहता हूँ मेरी मुख्य यूआई धागे पर एक इनलाइन विधि आह्वान है। इसलिए मैं मुख्य थ्रेड पर इस बुलाया:

_uiDispatcher = Dispatcher.CurrentDispatcher; 

और अब मैं एक धागे से कि धागे पर कुछ कोड निष्पादित करने के लिए चाहते हैं। मैं यह कैसे करुं? क्या मैं गलत वाक्यविन्यास का उपयोग कर रहा हूं?

ध्यान दें कि यह एक WPF अनुप्रयोग नहीं है; मैंने WindowsBase का संदर्भ दिया है, इसलिए मैं कक्षा तक पहुंच प्राप्त कर सकता हूं।

+0

के माध्यम से पहुँचा जा सकता है है, तो किस तरह के '_uiDispatcher' है? क्या आपने यूआई की सिंक्रनाइज़ ऑब्जेक्ट का उपयोग किया था? – IAbstract

+0

'uiDispatcher' http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.aspx का एक उदाहरण है। मैंने सोचा था कि '_uiDispatcher = Dispatcher.CurrentDispatcher' से निहित था। "यूआई" में सिंक्रनाइज़ ऑब्जेक्ट AFAIK नहीं है .... लेकिन मैं इसका उपयोग कैसे करूं? मेरे लिए यह क्या करेगा? – mpen

+0

आह ... ठीक है, मुझे नहीं लगता कि थ्रेड प्रेषक काम करने जा रहा है। क्या यह एक WinForm एप्लिकेशन है? – IAbstract

उत्तर

53

समस्या यह है कि आप उस प्रतिनिधि के प्रकार टाइप नहीं कर रहे हैं, जिसे आप आमंत्रित करना चाहते हैं। Dispatcher.Invoke बस Delegate लेता है। क्या यह Action<T> है? यदि हां, तो T क्या है? क्या यह MethodInvoker है? Action? क्या?

यदि आपके प्रतिनिधि को कोई तर्क नहीं होता है और कुछ भी नहीं देता है, तो आप Action या MethodInvoker का उपयोग कर सकते हैं। इस प्रयास करें:

_uiDispatcher.Invoke(new Action(() => { })); 
+0

मुझे लगता है कि मुझे अधिकांश विधियों में उपयोग किया जाता है जो एक प्रतिनिधि को हस्ताक्षर प्रदान करते हैं, इसलिए मुझे एक निर्दिष्ट करने की आवश्यकता नहीं है। हालांकि यह समझ में आता है। धन्यवाद! – mpen

+1

मुझे नहीं लगता कि यह काम करता है कि मैंने यह कैसे सोचा था। इस विधि को कभी भी लागू नहीं किया जाता है; मुझे लगता है कि डब्ल्यूपीएफ आमतौर पर आपके लिए इसे संभालता है और समय-समय पर उन तरीकों को निष्पादित करता है? शायद मुझे सिर्फ 'कतार ' चाहिए और इसे स्वयं प्रबंधित करें ... – mpen

1

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

इस एक WinForm अनुप्रयोग, अपने यूआई धागा WindowsFormsSynchronizationContext

+0

यह WinForm ऐप भी नहीं है; मैं ओपनजीएल का उपयोग कर रहा हूँ। ओपनजीएल एक जीएल संदर्भ का उपयोग करता है, और आप इसे उसी धागे से ही खींच सकते हैं जिस पर इसे बनाया गया था। मैं मुख्य धागे पर कुछ सामान चलाने के लिए एक तरीके से आने की कोशिश कर रहा था ... मैंने पहले एक WPF ऐप में 'डिस्पैचर' का उपयोग किया है, इसलिए मैंने सोचा कि मैं इस समस्या को हल करने के लिए इसे फिर से उपयोग कर सकता हूं। – mpen

4
this.Dispatcher.Invoke((Action)(() => { textBox1.Text = "Test 123"; })); 
संबंधित मुद्दे