2011-05-10 11 views
12

हाय मैं निम्नलिखित देखें कोड:इस कोड में कार्रवाई का उपयोग क्यों करें?

void UpdateMessage (string message) 
{ 
    Action action =() => txtMessage.Text = message; 
    this.Invoke (action); 
} 

क्यों कार्रवाई का उपयोग कर और फिर यहाँ कार्रवाई आह्वान? फ़ंक्शन बॉडी में कोड को प्रतिस्थापित करने के लिए केवल txtMessage.Text = message का उपयोग क्यों नहीं कर रहे हैं?


अद्यतन

कोड का विस्तृत संस्करण, एक टिप्पणी में प्रस्तुत किया, वाक्य रचना हाइलाइटिंग के साथ नीचे reproduced, खरोज आदि

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     new Thread(Work).Start(); 
    } 

    void Work() 
    { 
     Thread.Sleep(5000); 
     UpdateMessage("My Garden"); 
    } 

    void UpdateMessage(string message) { 
     Action action =() => textBox1.Text = message; 
     this.Invoke(action); 
    } 
} 
+0

इस WinForms में है? –

+1

मुझे लगता है कि आपने जो कुछ भी ठोकर खाया है, वह है जिसे हम व्यवसाय में "खराब कोड" कहते हैं। यह उस प्रणाली में किसी जगह से कॉपी किया गया हो सकता है जिसे वास्तव में संकेत की आवश्यकता होती है। लेकिन आप 100% सही हैं। यह नहीं करता। – Axeman

+0

@ एक्समैन आप कोड से कैसे बता सकते हैं कि अद्यतन मैसेज हमेशा जीयूआई थ्रेड में चलता है? –

उत्तर

20

क्योंकि इस कोड एक अलग धागा पर चलता है यूआई से और यूआई थ्रेड में Invoke के साथ marshalled किया जाना चाहिए।

documentationControl.Invoke() के लिए कहता है:

धागा है कि नियंत्रण की अंतर्निहित खिड़की संभाल मालिक पर निर्दिष्ट प्रतिनिधि पर क्रियान्वित।

यह सब आवश्यक है क्योंकि अंतर्निहित विंडोज फ्रेमवर्क की आवश्यकता है कि विंडो हैंडल पर ऑपरेशन विंडो थ्रेड के मालिक के थ्रेड द्वारा किया जाता है।

12

UpdateMessage एक और धागा आप जीयूआई तत्वों के साथ बातचीत करने के लिए मुख्य थ्रेड में आह्वान करने की जरूरत से कहा जाता है

आप का उपयोग करते हैं तो बस txtMessage.Text = message आप CrossThreadOperationException

+0

पैटर्न से परिचित होने के बाद यह बहुत आसान है, हाँ, यह अद्यतन मैसेज मुख्य यूआई थ्रेड के अलावा किसी अन्य थ्रेड में लगाया जाता है। लेकिन मैं txtMessage.Text = संदेश का उपयोग क्यों करता हूं और उस अपवाद को नहीं देखा जो वहां होना चाहिए? धन्यवाद! – spspli

4

आप में एक नियंत्रण के गुणों के साथ काम करना चाहिए मिल जाएगा यूआई थ्रेड, अन्यथा आपको अपवाद प्राप्त होगा।

Control.Invoke() विंडो संदेश लूप पर विंडोज संदेश भेजकर आपके प्रतिनिधि को निष्पादित करेगा।

लेकिन आप अनावश्यक धागा समन्वयन को रोकने के लिए कोड का अनुकूलन कर सकते हैं जब यह आवश्यक नहीं है:

void UpdateMessage (string message) 
{ 
    if(InvokeRequired) 
    { 
     Invoke((Action)()=>UpdateMessage(message)); 
     return; 
    } 

    txtMessage.Text = message; 
} 
+0

यह पूर्ण कोड है: – spspli

+0

सिस्टम का उपयोग कर; System.Collections.Generic का उपयोग कर ; System.ComponentModel का उपयोग कर ; System.Data का उपयोग कर ; सिस्टम का उपयोग कर ; ड्रॉइंग; System.Linq का उपयोग कर ; System.Text का उपयोग कर ; System.Windows.Forms का उपयोग कर ; सिस्टम का उपयोग कर । थ्रेडिंग; नाम स्थान TestAction { \t सार्वजनिक आंशिक वर्ग Form1: फार्म \t { \t \t सार्वजनिक Form1() \t \t { \t \t \t InitializeComponent(); \t \t \t नया थ्रेड (कार्य) .Start(); \t \t} \t \t शून्य वर्क() \t \t { \t \t \t Thread.Sleep (5000); \t \t \t अद्यतन संदेश ("मेरा गार्डन"); \t \t} \t \t शून्य UpdateMessage (स्ट्रिंग संदेश) \t \t { \t \t \t कार्रवाई कार्रवाई =() => textBox1.Text = संदेश; \t \t \t यह। इन्वोक (कार्रवाई); \t \t} \t} } – spspli

+1

इस कोड में, आप धागा है कि निर्माता से में शुरू किया गया था से UpdateMessage विधि कॉल। Control.Invoke() कॉल वर्तमान परिदृश्य में nessesary है। –

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