2011-06-06 8 views
9

Jon Skeet के अनुसार, "आप केवल एक प्रतिनिधि BeginInvoke जो एक लक्ष्य मंगलाचरण है पर कॉल कर सकते हैं।"MulticastDelegate पर Begin BeginInvoke कॉल करें?

वह क्यों है? असली कारण क्या है?

नोट: स्पष्टीकरण के लिए (और क्योंकि मैं इस गलती की है), मैं BeginInvoke के बारे में प्रतिनिधियों पर, बात कर रहा हूँ नियंत्रण पर नहीं।

+0

आप तुल्यकालिक प्रतिनिधि आह्वान करते हैं, यह किसी भी तरह है जो पहले से चलाने के लिए एक, क्यों अतुल्यकालिक निष्पादन किसी भी अलग होना चाहिए जानता है? – svick

+0

@svick: मुझे लगता है कि यह नहीं होगा। यह क्रम में वे जोड़ रहे हैं, सही में invokes? – richard

+0

@svick: मैं अपने सवाल से बाहर मेरी "अनुमान" ले लिया। मैं वास्तव में नहीं जानता कि तुम क्यों नहीं 'पर एक' MulticastDelegate' BeginInvoke' कर सकते हैं। – richard

उत्तर

7

मुझे लगता है कि जॉन स्कीट आप लिंक किए गए एक अच्छा काम पोस्ट में समझा करता है:

कैसे आप सूत्रण काम करना चाहते हैं? आप प्रत्येक मंगलाचरण तुल्यकालिक चलाते हैं, लेकिन बुला धागे को सम्मान के साथ अतुल्यकालिक रूप से पूरी बात को चलाने के लिए है, या आप एसिंक्रोनस रूप से प्रत्येक मंगलाचरण चला सकते हैं?

अगर यह पूर्व है, बस एक ही ThreadPool काम आइटम जो प्रतिनिधि तुल्यकालिक कॉल चलाते हैं। यदि यह उत्तरार्द्ध है, Delegate.GetInvocationList साथ मंगलाचरण सूची हो और बदले में सूची के तत्व पर BeginInvoke कहते हैं।

मूल रूप से एक MulticastDelegate पर फोन BeginInvoke अस्पष्ट है, आप प्रतिनिधियों एक दूसरे के लिए नहीं प्रतीक्षा करने या करना चाहते हैं? सिद्धांत रूप में यह आपके लिए तय कर सकता है, विकल्प आपको अलग-अलग तरीके से प्रतिनिधियों को बुलाकर इच्छित तरीके का चयन करने के लिए मजबूर करने के लिए मजबूर किया गया है।

दूसरे शब्दों में यह एक डिजाइन पसंद भ्रम से बचने के है। इसके अलावा यह ध्यान रखें कि BeginInvoke पक्ष से बाहर गिर गया है और अतुल्यकालिक प्रोग्रामिंग के नए तरीकों इस पुराने मानक की संभावना नहीं अद्यतन करने के बनाने उपलब्ध हैं, इसलिए भले ही वे अब बदलना चाहते हैं, वहाँ कोई कारण नहीं है महत्वपूर्ण है।

0

किसी भी प्रतिनिधि प्रकार को देखते हुए एक काफी आसानी से एक वर्ग जो प्रतिनिधियों या तो उस प्रकार या एक व्युत्पन्न प्रकार के होते हैं जो गठबंधन और एक संयुक्त प्रतिनिधि जो सिर्फ सब कुछ एक MulticastDelegate कर सकते हैं के बारे में क्या करेंगे निकलेगा, और के एक नंबर लिख सकते हैं चीजें जो नहीं कर सकती हैं। एकमात्र चीज जो संयुक्त प्रतिनिधि की शैली करने में सक्षम नहीं होगी, उसके उपमहाद्वीप Delegate.Remove द्वारा निकाले गए हैं (क्योंकि वह कार्य संयुक्त इकाई को इकाई के रूप में मानता है)। मल्टीकास्टडिलेगेट के विपरीत, संयुक्त प्रतिनिधि व्युत्पन्न प्रतिनिधि प्रकार शामिल करने में सक्षम होंगे, और केवल उन स्थानों पर ठीक काम करेगा जो केवल एक लक्ष्य चाहते हैं।

vb.net में, कोड होगा कुछ की तरह:

 
Class DoubleAction(Of T) 
    Private _Act1, _Act2 As Action(Of T) 
    Private Sub New(ByVal Act1 As Action(Of T), ByVal Act2 As Action(Of T)) 
     _Act1 = Act1 
     _Act2 = Act2 
    End Sub 
    Private Sub Invoke(ByVal Param As T) 
     _Act1(Param) 
     _Act2(Param) 
    End Sub 
    Function Combine(ByVal Act1 As Action(Of T), ByVal Act2 As Action(Of T)) As Action(Of T) 
     Dim newAct As New DoubleAction(Of T)(Act1, Act2) 
     Return AddressOf newAct.Invoke 
    End Function 
End Class 

अनुवाद सेल्सियस के लिए # आसान होना चाहिए।

प्रतिनिधियों के संयोजन के लिए इस दृष्टिकोण के साथ एकमात्र असली समस्या यह है कि प्रतिनिधि के प्रत्येक सामान्य परिवार के लिए बॉयलरप्लेट कोड आवश्यक है (क्योंकि .NET जेनेरिक प्रकार पैरामीटर के रूप में उपयोग करने की अनुमति नहीं देता है)।

0

वहाँ भी एक System.MulticastDelegate वस्तु पर BeginInvoke विधि कॉल करने के लिए एक समाधान नहीं है:

public class Program{ 

    public delegate void SayHello(); 

    public void SayHelloAndWait(){ 
     Console.WriteLine("HELLO.."); 
     System.Threading.Thread.Sleep(5000); 
     Console.WriteLine("..WORLD!"); 
    } 

    public void SayHi(){ 
     Console.WriteLine("Hi world!"); 
    } 

    public void Run(){ 
     SayHello helloMethods; 
     helloMethods = SayHelloAndWait; 
     helloMethods += SayHi; 
     foreach(SayHello hello in helloMethods.GetInvocationList()) 
     hello.BeginInvoke(null,null); 
    } 

    public static void Main(String[] args){ 
     new Program().Run(); 
     Console.Read(); 
    } 

} 

अतुल्यकालिक तरीकों पिछले मंगलाचरण सूची के आधार पर करने के लिए पहले से फलस्वरूप लागू कर रहे हैं।

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