मेरे BeginInvoke()/EndInvoke() प्रश्न से निम्नलिखित प्रदर्शन में/प्रतिनिधि के बीच कुछ और अंतर हैं। BeginInvoke() और QueueUserWorkItem() का उपयोग करके एक प्रतिनिधि को अतुल्यकालिक रूप से आमंत्रित करने के लिए?QueueUserWorkItem() और BeginInvoke() के बीच कोई अंतर नहीं है, बिना किसी रिटर्न प्रकार वाले एसिंक्रोनस गतिविधि करने के लिए
उत्तर
http://blogs.msdn.com/cbrumme/archive/2003/07/14/51495.aspx
का कहना है:
"एक आश्चर्य की बात यह है कि इस भी कारण है कि Delegate.BeginInvoke/ EndInvoke बराबर (या ThreadPool.QueueUserWorkItem तरह तकनीकों की तुलना में कर रहे हैं ताकि धीमी है UnsafeQueueUserWorkItem यदि आप सुरक्षा प्रभावों को समझते हैं और वास्तव में कुशल होना चाहते हैं) BeginInv के लिए codepath ओके/एंडइवोक सामान्य सामान्य रीमोटिंग मार्ग के प्रोसेसिंग कोड में तुरंत बदल जाता है। "
हमम, धन्यवाद, यह दिलचस्प और बहुत डरावना दोनों है। मुझे लगता है कि मैं किसी भी BeginInvoke()/EndInvoke() कोड को वापस रोल करूंगा जिसके लिए वापसी मूल्यों की आवश्यकता नहीं है! – endian
मुख्य बात मैं QueueUserWorkItem
साथ के बारे में सोच सकते हैं कि आप अगर आप पहले से ही एक SomeRandomDelegate
उदाहरण और कुछ आर्ग है WaitCallback
प्रतिनिधि प्रकार है, जो लग रहा है मुश्किल का उपयोग करना होगा है। अच्छी खबर यह है कि आप एक बंद के साथ इसे ठीक कर सकते है:
ThreadPool.QueueUserWorkItem(
delegate { someDelegate(arg1, arg2); }
);
यह पैटर्न भी सुनिश्चित करता है आप संकलन समय पर (QueueUserWorkItem
के लिए एक object
राज्य आर्ग गुजर और लक्ष्य विधि में यह कास्टिंग के विपरीत) उचित मजबूत टाइपिंग मिलता है। जब तरीकों को सीधे फ़ोन यह पैटर्न का भी इस्तेमाल किया जा सकता है:
ThreadPool.QueueUserWorkItem(
delegate { SomeMethod(arg1, arg2); }
);
जाहिर है, बिना एक EndInvoke
बराबर, आप भी नहीं एक वापसी मान वापस बाहर निकल सकते हैं जब तक आप एक विधि कॉल/अंत में एक घटना/आदि बढ़ा आपकी विधि का ... संबंधित नोट पर, आपको exception handling से सावधान रहना होगा।
इस सटीक परिदृश्य का मुकाबला पहली बार मैंने खुद को सोचा था, "वाह, मुझे प्यार है बंद। " –
वाह, यह एक सर्वोच्च टिप है। यह एक मुक्केबाजी/अनबॉक्सिंग अर्थपूर्ण की तरह लगता है, और मैं चीजों की व्यापक योजना में, और अधिक महंगा नहीं सोचता हूं। –
ओह, तकनीकी रूप से, यह कोड को संकलित करने के लिए "प्रतिनिधि (ऑब्जेक्ट ओ)" या समान होना चाहिए, मेरा मानना है कि चूंकि QueueUserWorkItem एक प्रतिनिधि हस्ताक्षर की अपेक्षा करता है जो प्रतीक्षाकॉलबैक से मेल खाता है, यानी, जिसमें ऑब्जेक्ट का एक पैरामीटर शामिल है। –
कोई बड़ा अंतर नहीं होना चाहिए, मुझे यह भी लगता है कि एक प्रतिनिधि के लिए उत्पन्न BeginInvoke/EndInvoke निष्पादित करने के लिए थ्रेड पूल का उपयोग करता है।
कोई प्रदर्शन अंतर नहीं होना चाहिए, दोनों प्रतिनिधिमंडल के रूप में। BginginInvoke और ThreadPool.QueueUserWorkItem थ्रेड पूल थ्रेड पर निष्पादित होगा।
सबसे बड़ा अंतर यह है कि यदि आप BeginInvoke को कॉल करते हैं, तो आप किसी बिंदु पर EndInvoke को कॉल करने के लिए बाध्य हैं। इसके विपरीत, ThreadPool.QueueUserWorkItem "आग और भूल" है। इसका लाभ और कमी है। लाभ यह है कि आप इसके बारे में भूल सकते हैं। इस बात की कमी यह है कि जब तक कार्य पूरा नहीं हो जाता है, तब तक जब तक आप अपना स्वयं का सिंक्रनाइज़ेशन/अधिसूचना तंत्र नहीं जोड़ते, तब तक आपको जानने का कोई तरीका नहीं है।
EndInvoke() एक उपयोगी लेकिन शायद ही कभी उल्लेख व्यवहार है - यह सब बिना क्रिया अपवाद rethrows कि प्रतिनिधि मूल थ्रेड के संदर्भ में उत्पन्न ताकि आप मुख्य कोड में अपवाद संसाधन तर्क स्थानांतरित कर सकते हैं।
इसके अलावा, यदि आपके प्रतिनिधि के पास आउटपुट/आउट पैरामीटर हैं, तो उन्हें एंडइनवोक() हस्ताक्षर में जोड़ा जाएगा जब आप निष्पादन समाप्त करते समय उन्हें प्राप्त करने की अनुमति देते हैं।
बहुत धन्यवाद, मुझे यह नहीं पता था – endian
यदि आप थ्रेडपूल को कॉल करते हैं।QueueUserWorkItem, कार्य आइटम में उठाए गए अपवाद पृष्ठभूमि थ्रेड पर अनचाहे किए जाएंगे (जब तक कि आप उन्हें स्पष्ट रूप से पकड़ न लें)। .Net 2 और इससे ऊपर में यह आपके ऐपडोमेन को समाप्त कर देगा।
यदि आप प्रतिनिधि को कॉल करते हैं। बेगिन इनवोक() तो एंडइवोक() कहा जाता है तो अपवादों को फिर से फेंकने के लिए कतारबद्ध किया जाता है। यदि आप EndInvoke() को कभी भी कॉल नहीं करते हैं, तो अपवाद अनिवार्य रूप से 'लीक' मेमोरी हैं (जैसा कि एसिंक ऑपरेशन द्वारा जारी नहीं किया गया कोई अन्य राज्य है)।
- 1. क्या रिटर्न स्टेटमेंट के साथ और बिना किसी फ़ंक्शन के बीच कोई अंतर है?
- 2. एसिंक्रोनस कॉल और एसिंक्रोनस आईओ कॉल के बीच अंतर .net
- 3. रिटर्न myVar बनाम रिटर्न (myVar) के बीच कोई अंतर है?
- 4. क्या एमआईएमई और सामग्री प्रकार के बीच कोई अंतर है?
- 5. गतिविधि और टुकड़े के बीच अंतर
- 6. तुल्यकालिक एपिस और एसिंक्रोनस एपिस के बीच क्या अंतर है?
- 7. पैरामीटर परिभाषाओं के बीच अंतर (प्रकार और नाम), और (प्रकार * नाम) के बीच अंतर क्या हैं?
- 8. '# ^' प्रकार संकेत और `^ 'प्रकार संकेत के बीच क्या अंतर है?
- 9. गतिविधि और संदर्भ के बीच क्या अंतर है?
- 10. रिटर्न-पथ, उत्तर-से-बीच और बीच के बीच व्यवहार अंतर क्या है?
- 11. "लाइन फीड" और "कैरिज रिटर्न" के बीच क्या अंतर है?
- 12. (प्रकार) मान और प्रकार (मान) के बीच क्या अंतर है?
- 13. क्या GORM के लिए 'स्थैतिक ट्रांजिस्टर' और 'क्षणिक प्रकार एफ़िल्ड' घोषणा के बीच कोई अंतर है?
- 14. Invoke और BeginInvoke
- 15. किसी ऑब्जेक्ट और हैश के बीच अंतर?
- 16. बिना किसी प्रकार के अपवाद
- 17. क्या "इस" सूचक का उपयोग करने और इसका उपयोग नहीं करने के बीच कोई अंतर है?
- 18. किसी ऑब्जेक्ट और डिक्शनरी के बीच अंतर?
- 19. क्या System.Windows.Clipboard और System.Windows.Forms.Clipboard के बीच कोई अंतर है?
- 20. वहाँ के बीच ग्राहक Enum प्रकार और सिस्टम Enum प्रकार कोई अंतर है
- 21. क्या ब्लब्स और जुड़े घटकों के बीच कोई अंतर है?
- 22. क्या होम स्क्रीन से एंड्रॉइड गतिविधि ऑन रेस्यूम के बीच अंतर करने का कोई तरीका है?
- 23. क्या कोई इकाई और वस्तु के बीच कोई अंतर है?
- 24. पायथन में रिटर्न और प्रिंटिंग के बीच अंतर?
- 25. "डब्ल्यूडब्ल्यूडब्ल्यू के साथ यूआरएल और डब्ल्यूडब्ल्यूडब्ल्यू के बिना यूआरएल" - क्या उनके बीच कोई अंतर है?
- 26. "। +" और "। +?" के बीच अंतर
- 27. डेटा-डोजो-प्रकार और डोजोटाइप के बीच क्या अंतर है?
- 28. जावास्क्रिप्ट स्ट्रिंग प्रकार और स्ट्रिंग ऑब्जेक्ट के बीच अंतर?
- 29. क्या "foo is none" और "foo == कोई नहीं" के बीच कोई अंतर है?
- 30. कैम्पिंग और सिनात्रा के बीच कोई महत्वपूर्ण अंतर है?
आप यह भी देखना चाहेंगे: http://marcgravell.blogspot.com/2009/02/async-without-pain.html –