2009-07-01 9 views
8

मैं एक छोटे से चैट एप्लिकेशन लिख रहा हूँ, और मैं इस ईवेंट हैंडलर है:सी #, ईवेंट हैंडलर्स और थ्रेडिंग

void o_Typing(object sender, EventArgs e) 
{ 
    MessageBox.Show("Fired!"); 
    this.Text = "Fired!"; 
} 

o_Typing एक वर्ग TabPage से व्युत्पन्न में एक विधि है। असल में, मैं चाहता हूं कि प्रत्येक वार्तालाप का अपना टैब हो।

ईवेंट हैंडलर को मेरे चैट ऑब्जेक्ट द्वारा निकाल दिया जाता है, जो किसी अन्य थ्रेड में चल रहा है। मेरे पास यूआई के लिए 1 धागा है, और प्रत्येक चैट वार्तालाप के लिए एक और धागा (नए डेटा के लिए सर्वर को मतदान करने के लिए)

जब ईवेंट निकाल दिया जाता है, तो MessageBox पॉप अप हो जाता है, लेकिन टैब कैप्शन नहीं बदलता है। घटना को एक बार निकाल दिया गया है, यह फिर से कभी नहीं आग लगती है, मुझे विश्वास है कि घटना कार्यकर्ता धागे में बुलाया जा रहा है, हालांकि इसे यूआई थ्रेड में परिभाषित किया गया है।

मैं अपने कार्यक्रमों को कार्यकर्ता धागे से कैसे बुला सकता हूं, और यूआई थ्रेड पर निष्पादित करने के लिए Invoke() का उपयोग कर सकता हूं?

उत्तर

11

वहाँ दो विकल्प हैं।

2) घटना को बढ़ाने से पहले कार्यकर्ता थ्रेड मार्शल को यूआई थ्रेड पर वापस लाएं - दूसरे शब्दों में, घटना को बढ़ाने की प्रक्रिया के हिस्से के रूप में Control.Invoke का उपयोग करें, ताकि ईवेंट हैंडलर को यूआई थ्रेड में बुलाया जाएगा । आपके ऐप को कैसे संरचित किया जाता है, इस पर निर्भर करता है कि आप अपने इवेंट-राइजिंग घटक को यूआई के बारे में स्पष्ट रूप से जानना नहीं चाहते हैं - लेकिन जब इसे बनाया जा रहा है तो आप ISynchronizeInvoke (जो Control उपकरण) में गुजर सकते हैं और आपका घटक इसका उपयोग अपने ईवेंट को बढ़ाने के लिए कर सकता है दाहिने धागे पर बेशक, यह केवल काम करता है (बस, वैसे भी) यदि प्रत्येक घटना हैंडलर एक ही थ्रेड पर चलाने के लिए खुश है - लेकिन यह अक्सर मामला होगा। आप कुछ लिखेंगे जैसे:

protected void OnFoo(EventArgs args) 
{ 
    if (sync != null && sync.InvokeRequired) 
    { 
     sync.Invoke((Action) delegate { OnFoo(args) }, null); 
     return; 
    } 
    EventHandler handler = Foo; // Where Foo is the event name 
    if (handler != null) 
    { 
     handler (this, args); 
    } 
} 
+0

धन्यवाद, मैंने ईवेंट हैंडलर पर Invoke() का उपयोग किया और यह एक आकर्षण की तरह काम किया। –

6

यदि आप अपने कार्यकर्ता थ्रेड द्वारा निष्पादित कोड में अपना ईवेंट आग लगाते हैं, तो ईवेंट के लिए सदस्यता लेने वाली सभी विधियां उस कार्यकर्ता धागे के तहत निष्पादित की जाएंगी।

जीयूआई तत्वों के लिए आपको इनवोक-विधियों को देखने की आवश्यकता है।

1) बनाओ ईवेंट हैंडलर्स धागा सुरक्षित: किसी भी इवेंट हैंडलर जो यूआई धागा से बात करने की जरूरत है में Control.Invoke/BeginInvoke का उपयोग

बेस्ट सादर

+0

उत्तर के लिए धन्यवाद, मेरा संपादन देखें। –

+0

आप नहीं करते हैं। आप ईवेंट को अपने कार्यकर्ता धागे पर कॉल करते हैं, और प्रत्येक ग्राहक को यह जांचना चाहिए कि क्या यह सही धागे पर है और यदि उसे आवश्यकता हो तो खुद को आमंत्रित करें। –

+0

या जाहिर है, जैसा कि जॉन सुझाव देता है आप कर सकते हैं। –

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