2008-11-17 43 views
9

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

उत्तर

16

बदले में प्रत्येक श्रोता जाँच करने के लिए, आप मैन्युअल GetInvocationList के माध्यम से संचालकों प्राप्त करने की आवश्यकता:,

class Foo 
{ 
    public event CancelEventHandler Bar; 

    protected void OnBar() 
    { 
     bool cancel = false; 
     CancelEventHandler handler = Bar; 
     if (handler != null) 
     { 
      CancelEventArgs args = new CancelEventArgs(cancel); 
      foreach (CancelEventHandler tmp in handler.GetInvocationList()) 
      { 
       tmp(this, args); 
       if (args.Cancel) 
       { 
        cancel = true; 
        break; 
       } 
      } 
     } 
     if(!cancel) { /* ... */ } 
    } 
} 
+5

इस कोड जबकि काम करेगा कि एक CancelEventHandler के सामान्य ऑपरेशन? क्या वे आमतौर पर पहले सेक्सएक्स, आफ्टरएक्स पैटर्न में उपयोग नहीं किए जाते हैं, जहां कुछ पहले कैनेल सेट करता है, तो एक्स ऐसा नहीं होता है इसलिए AfterX को कॉल नहीं किया जाता है। अन्य श्रोताओं को पहले की घटना को रोकने के लिए क्यों महत्वपूर्ण है? –

+0

मैं उपर्युक्त टिप्पणी का जवाब जानना चाहता हूं कि अन्य श्रोताओं को पहले की घटना को रोकने के लिए क्यों महत्वपूर्ण है। – MPavlak

+3

एक ही घटना (उसी वस्तु में) के दो ग्राहकों की कल्पना करो। एक 'रद्द = सत्य' सेट करता है और दूसरा "रद्द = झूठा" सेट करता है। आपको क्या लगता है कि ऐसा होगा? जवाब दिखाता है कि ऐसी स्थिति से कैसे बचें। यदि कम से कम एक ग्राहक घटना रद्द कर देता है, तो इसे रद्द कर दिया जाता है। अवधि। – Joel

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