2013-01-17 23 views
34

तुम मेरे लिए यह समझा सकते हैं तो कृपया:का उपयोग कैसे करें BeginInvoke सी #

someformobj.BeginInvoke((Action)(() => 
{ 
    someformobj.listBox1.SelectedIndex = 0; 
})); 

आप मुझे बता सकते हैं कि कैसे मैं begininvoke वास्तव में उपयोग कर सकते हैं? Action प्रकार क्या है? खाली ब्रैकेट () क्यों है? और इसका क्या अर्थ है =>?

+2

एक पोस्ट में इतने सारे अलग-अलग प्रश्न ... - कम से कम 3 अलग-अलग प्रश्न होना चाहिए – Prokurors

+0

इस आलेख को भी देखें http://mark-dot-net.blogspot.com.uy/2014/07 /six-ways-to-initiate-tasks-on-another.html –

उत्तर

57

Action .NET ढांचे द्वारा प्रदान किए गए प्रतिनिधि का एक प्रकार है। Action कोई पैरामीटर वाले विधि को इंगित करता है और कोई मान नहीं देता है।

() =>lambda expression वाक्यविन्यास है। लैम्ब्डा अभिव्यक्ति प्रकार Delegate नहीं हैं। आह्वान Delegate तो Action लैम्ब्डा अभिव्यक्ति लपेट और प्रदान की उम्मीद Type को Invoke()

Invoke कारणों कहा Action धागा है कि नियंत्रण की खिड़की संभाल बनाया पर अमल करने के लिए किया जा सकता है की आवश्यकता है। Exceptions से बचने के लिए धागे बदलना अक्सर आवश्यक होता है। उदाहरण के लिए, अगर कोई प्रॉपर्टी RichTextBox पर सेट करने का प्रयास करता है, जब कोई आमंत्रण आवश्यक होता है, बिना किसी कॉलिंग के, तो Cross-thread operation not valid अपवाद फेंक दिया जाएगा। आमंत्रण कॉल करने से पहले Control.InvokeRequired देखें।

BeginInvokeInvoke का असीमित संस्करण है।असिंक्रोनस का मतलब है कि थ्रेड कॉलर को अवरुद्ध नहीं करेगा जो एक सिंक्रोनस कॉल के विपरीत है जो अवरुद्ध है।

+0

थानक यू बहुत कुछ जोड़ा :) –

+0

तो अगर मैं इसे सही ढंग से समझता हूं, तो क्रॉस-थ्रेड सुरक्षा की गारंटी के लिए एक्शन का उपयोग किया जाता है, तो आप ऑब्जेक्ट को मूल्य सेट करने के बजाय विधि कॉल के माध्यम से सूचित करेंगे? इसके अलावा, विधि किसी भी प्रतिनिधि को स्वीकार नहीं करेगी, न केवल विशेष रूप से एक क्रिया, हां? –

+4

@ केलीबारन - 'एक्शन' थ्रेड सुरक्षा से असंबंधित है, जो' आमंत्रण 'है। 'Invoke' पैरामीटर के रूप में' प्रतिनिधि 'स्वीकार करता है। इसलिए 'प्रतिनिधि' को परिवर्तनीय कुछ भी पैरामीटर के रूप में पारित किया जा सकता है। –

9

मुझे लगता है कि आपका कोड विंडोज फॉर्म से संबंधित है।
यदि आप UI थ्रेड में अतुल्यकालिक रूप से निष्पादित करने की आवश्यकता है तो आपको BeginInvoke पर कॉल करें: अधिकांश मामलों में नियंत्रण की गुण बदलें।
काफी हद तक यह कुछ प्रक्रियाओं में प्रतिनिधि को पारित किया जा रहा है जिसे आवधिक रूप से निष्पादित किया जा रहा है। (संदेश लूप प्रसंस्करण और उस तरह की चीजें)

यदि BeginInvokeDelegate के लिए कॉल किया गया है तो प्रतिनिधि को केवल असंकालिक रूप से बुलाया जाता है।
(Invoke सिंक संस्करण के लिए।)

आप अधिक सार्वभौमिक कोड जो WPF और WinForms आपको कार्य समानांतर लाइब्रेरी विचार कर सकते हैं और अनुसार context साथ Task चलाने के लिए पूरी तरह से काम करता है चाहते हैं। (TaskScheduler.FromCurrentSynchronizationContext())

और दूसरों द्वारा पहले से ही कहने के लिए थोड़ा जोड़ने के लिए: लैम्बडास को या तो अनाम विधियों या expressions के रूप में माना जा सकता है।
और यही कारण है कि आप लैम्बडास के साथ var का उपयोग नहीं कर सकते हैं: कंपाइलर को एक संकेत की आवश्यकता है।

अद्यतन:

इस नेट v4.0 और उच्च

// This line must be called in UI thread to get correct scheduler 
var scheduler = System.Threading.Tasks.TaskScheduler.FromCurrentSynchronizationContext(); 

// this can be called anywhere 
var task = new System.Threading.Tasks.Task(() => someformobj.listBox1.SelectedIndex = 0); 

// also can be called anywhere. Task will be scheduled for execution. 
// And *IF I'm not mistaken* can be (or even will be executed synchronously) 
// if this call is made from GUI thread. (to be checked) 
task.Start(scheduler); 

की आवश्यकता है कि आप अन्य धागे से काम करना शुरू कर दिया और उसके completition task.Wait() के लिए प्रतीक्षा करने तक धागा बुला अवरुद्ध कर देगा की जरूरत है कार्य का अंत

कार्यों here कार्यों के बारे में और पढ़ें।

+0

क्या आप मुझे कुछ उदाहरण दे सकते हैं? –

+0

@MohammedNoureldin मैंने कुछ कोड –