2011-06-30 11 views
6

संभावित डुप्लिकेट:
Must every BeginInvoke be followed by an EndInvoke?
Is EndInvoke() optional, sort-of optional, or definitely not optional?असिंक्रोनस इनवोकिंग - एंडइवोक की आवश्यकता है?

मैं एक बहु आवेदन मिल गया है, और माध्यमिक धागे में से एक मुख्य थ्रेड पर निष्पादित करने के लिए एक बार हर कुछ कोड प्राप्त करने की जरूरत है कुछ देर। कोई वापसी मूल्य नहीं है, और दूसरा धागा परवाह नहीं करता है अगर यह कोई अपवाद उठाता है या दौड़ने में विफल रहता है।

अभी तक, मैं इसे Form.Invoke के माध्यम से कोड चलाने के लिए प्राप्त कर रहा हूं, लेकिन कभी-कभी इसे सामान्य (कुछ सेकंड) से अधिक लंबा लगता है और जब तक यह पूरा नहीं हो जाता तब तक थ्रेड को अवरुद्ध कर देता है। मुझे दूसरे थ्रेड की आवश्यकता है ताकि कई सेकंड तक रुकने के बिना निष्पादन जारी रखा जा सके।

BeginInvoke लगता है जैसे यह अच्छी तरह से काम करेगा, लेकिन मेरे पास वास्तव में EndInvoke पर कॉल करने के लिए कहीं भी नहीं है, क्योंकि मैं इसके लिए इंतजार नहीं करना चाहता हूं या वापसी मूल्य प्राप्त नहीं करना चाहता हूं। और इस बात पर विचार करते हुए कि कोड को बुलाया जा रहा है, मूल कॉल का एक गुच्छा शामिल है, मुझे यकीन नहीं है कि EndInvoke नहीं है।

क्या मुझे EndInvoke पर कॉल करने की ज़रूरत है, या क्या मुख्य रूप से थ्रेड को मुख्य रूप से चलाने के लिए कोड प्राप्त करने का कोई अन्य तरीका है जिसे मुझे इसके बजाय उपयोग करना चाहिए?

धन्यवाद =)

उत्तर

6

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

स्रोत: http://msdn.microsoft.com/en-us/library/0b1bf3y3.aspx तहत टिप्पणियां

+0

बहुत बढ़िया है, इसलिए मैं कुछ भी उड़ाए बिना अपने 'Invoke' को 'BeginInvoke' में बदल सकता हूं। –

3

आप सुनिश्चित करना चाहिए कि EndInvoke कहा जाता है, लेकिन आप यह बहुत आसानी से की तरह कुछ कर सकते हैं,:

var action = new Action(SomeMethodGroup); 

    action.BeginInvoke(new AsyncCallback(

     x => (x.AsyncState as Action).EndInvoke(x)), action); 
+0

मेरा मानना ​​है कि ओपी तथा सामान्यतः विशेष रूप से Form.BeginInvoke के बारे में बात कर रही है शुरू/EndInvoke पैटर्न। एमएसडीएन को देखकर, फॉर्म.बिनगिन इनवोक शुरुआत/एंड इनवोक पैटर्न का पालन नहीं करता है। – dtb

+0

@ डीटीबी, असल में, मुझे विश्वास नहीं है कि यह फॉर्म.बिनिन इनवोक या प्रतिनिधि के लिए कड़ाई से जरूरी है। बेगिन इनवोक, जैसा कि मेरा मानना ​​है कि यह केवल प्रतीक्षा प्रतीक्षा करता है अगर आप प्रतीक्षा करने का प्रयास करते हैं (यानी एंड एंडवोक कॉल करें।) वेटहैंडल को साफ करने की आवश्यकता है ऊपर, लेकिन अगर आप EndInvoke कहा जाता है। –

+0

अच्छा बिंदु, शायद आपको EndInvoke की आवश्यकता नहीं है, शायद एक साधारण विधि जो 'आग और भूल' रणनीति के रूप में काम कर सकती है? –

4

एक ठेठ कॉल करने के लिए EndInvoke के साथ एक पूरा होने कॉलबैक शामिल करके है जिस तरह से BeginInvoke ताकि आप कॉलबैक में EndInvoke को कॉल कर सकें। आरंभ/समाप्ति विधियों के लिए यह अधिक महत्वपूर्ण है जो Invoke से कुछ अधिक विशिष्ट करते हैं, जैसे BeginRead/EndRead; बाद के मामलों में, सफाई के लिए अंत की आवश्यकता हो सकती है और प्रक्रिया के दौरान हुई किसी भी अपवाद को भी फेंक दिया जाएगा।

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