सी # 3.0 और बाद:
एक विस्तार विधि आम तौर पर, जाने के लिए तरीका होगा जब से तुम हमेशा एक ISynchronizeInvoke
interface कार्यान्वयन पर एक काम करवाना चाहते हैं जा रहे हैं, यह एक अच्छा डिजाइन विकल्प है।
आप इस तथ्य के लिए anonymous methods (बंद) का लाभ भी ले सकते हैं कि आप यह नहीं जानते कि एक्सटेंशन विधि में कौन से पैरामीटर पास होंगे; बंद करने की आवश्यकता सब कुछ की स्थिति पर कब्जा करेगा।
// Extension method.
static void SynchronizedInvoke(this ISynchronizeInvoke sync, Action action)
{
// If the invoke is not required, then invoke here and get out.
if (!sync.InvokeRequired)
{
// Execute action.
action();
// Get out.
return;
}
// Marshal to the required context.
sync.Invoke(action, new object[] { });
}
फिर आप इसे इस तरह फोन चाहते हैं:
private void SetText(string text)
{
textBox1.SynchronizedInvoke(() => textBox1.Text = text);
}
इधर, बंद, text
पैरामीटर खत्म हो गया है कि राज्य पर कब्जा कर लिया और Action
delegate विस्तार विधि के लिए पारित के हिस्से के रूप पारित कर दिया है।
से पहले सी # 3.0:
आप लैम्ब्डा अभिव्यक्ति की विलासिता नहीं है, लेकिन आप अभी भी कोड सामान्यीकरण कर सकते हैं। यह बहुत ज्यादा एक ही है, लेकिन नहीं एक विस्तार विधि:
static void SynchronizedInvoke(ISynchronizeInvoke sync, Action action)
{
// If the invoke is not required, then invoke here and get out.
if (!sync.InvokeRequired)
{
// Execute action.
action();
// Get out.
return;
}
// Marshal to the required context.
sync.Invoke(action, new object[] { });
}
और फिर आप यह गुमनाम विधि वाक्य रचना के साथ फोन:
private void SetText(string text)
{
SynchronizedInvoke(textBox1, delegate() { textBox1.Text = text; });
}
हाँ अच्छा काम करता है, केवल एक चीज आप ध्यान दें करने की आवश्यकता है कि आप शामिल करने की जरूरत है: System.ComponentModel उपयोग करते हुए; और सिस्टम का उपयोग; –
मुझे पता है कि यह काफी पुराना है, लेकिन यह अभी भी इस समाधान के लिए खोजों के शीर्ष के करीब आ गया है ... इस समस्या के साथ यह है कि आप मानते हैं कि मूल वर्ग स्थिर है। आप एक नियमित कक्षा में एक स्थिर विस्तार नहीं जोड़ सकते हैं। अधिकांश रूपों/डब्ल्यूपीएफ जिनमें यूआई शामिल है, आप उन उदाहरणों के साथ नियमित कक्षाएं हैं। तो उन उदाहरणों में आप अभी भी नीचे दिखाए गए अज्ञात प्रतिनिधि के एकमात्र विकल्प के साथ छोड़ दिए गए हैं। –
@ जॉन्स सूट आप निश्चित रूप से "नियमित" कक्षा में एक स्थिर विधि जोड़ सकते हैं। पोस्ट 3.0 संस्करण एक विस्तार विधि है, और एक उदाहरण विधि के रूप में दिखाई देगा। प्री-3.0 संस्करण को कक्षा में नहीं रहना पड़ता है, यह किसी अन्य वर्ग पर रह सकता है, या यदि आपको वास्तव में आवश्यकता है तो आप विधि को एक उदाहरण विधि बना सकते हैं (लेकिन आप तब से नहीं जब से आप एक स्थिर विधि जोड़ सकते हैं)। – casperOne