2010-12-21 9 views
19

के बाईं ओर दिखाई दे सकता है मेरे पास एक लूप में एक ईवेंट है। मैं एक ही विधि को एक से अधिक घटनाओं में एक साथ जोड़ने के लिए कोशिश कर रहा हूं। मैंने add और remove एक्सेसर्स लागू किए हैं।-event- केवल + = या - =

हालांकि, मुझे लगता है कि यह कहते हुए कोई त्रुटि मिलती है:

ItemsProcessed can only appear on the left hand side of += or -=

जब मैं भी एक ही कक्षा के भीतर, उन्हें कॉल करने के लिए प्रयास करें। या तो एक प्रतिनिधि क्षेत्र या EventHandlerList की तरह कुछ -

ItemsProcessed(this, new EventArgs()); // Produces error 

public event EventHandler ItemsProcessed 
{ 
    add 
    { 
     ItemsProcessed -= value; 
     ItemsProcessed += value; 
    } 
    remove 
    { 
     ItemsProcessed -= value; 
    } 
} 
+3

इसके अलावा, ऐसा लगता है कि आपने 'आइटम्सप्रोसेस्ड' कार्यों को स्वयं 'आइटमप्रोसेस्ड' कार्यों में एक्सेस करके एक अनंत लूप बनाया है। – Gabe

+0

संदर्भ के लिए, 'EventName (args)' चाल का चाल केवल * फ़ील्ड-जैसी घटनाओं * पर लागू होता है, जहां कुछ ऑपरेशन कक्षा के भीतर * फ़ील्ड * (ईवेंट नहीं) को स्पष्ट रूप से हल करते हैं। मुझे "कुछ" कहना है, क्योंकि सटीक सूची सी # 3 और सी # 4. –

उत्तर

19
एक स्पष्ट घटना के साथ

, आप अपने खुद के समर्थन की दुकान उपलब्ध कराने के लिए की जरूरत है। वर्तमान कोड रिकर्सिव है। प्रयास करें:

private EventHandler itemsProcessed; 
public event EventHandler ItemsProcessed 
{ 
    add 
    { 
     itemsProcessed-= value; 
     itemsProcessed+= value; 
    } 

    remove 
    { 
     itemsProcessed-= value; 
    } 
} 

तब (और ध्यान देने योग्य बात मैं एक थोड़ा के बारे में सतर्क किया जा रहा हूँ "के बारे में null चालू करने के लिए" सूत्रण फिर से किनारे मामले):

var snapshot = itemsProcessed; 
if(snapshot != null) snapshot(this, EventArgs.Empty); 
अधिक हाल ही में सी # संस्करण के साथ

, इसे सरल बनाया जा सकता है:

itemsProcessed?.Invoke(this, EventArgs.Empty); 
+1

के बीच बदल गई है एक नुकसान: केवल –

+2

कक्षा के भीतर पहुंच योग्य क्यों आप कक्षा के बाहर एक निजी बैकिंग ईवेंट का उपयोग करना चाहते हैं? –

+0

सबक्लासिंग, दुह। सामान सुरक्षित बनाओ। – Nyerguds

1

क्या त्रुटि? मुझे लगता है कि इसकी स्टैक ओवरफ़्लो त्रुटि है, क्योंकि आप yourserlf (उसी ईवेंट) पर जोड़ने और निकालने के लिए कॉल कर रहे हैं। इसके अलावा आप ईवेंट एक्सेसर नहीं बढ़ा सकते हैं।

ऐसा करने का वैध तरीका निजी घटना का समर्थन करना है, जिसे सार्वजनिक एक्सेसर से जोड़ा और हटा दिया जाएगा, और आपको यह निजी ईवेंट उठाना चाहिए।

डैंग, देर से देर हो चुकी है।

+1

नहीं, उसे स्टैक ओवरफ़्लो के बारे में पता नहीं है क्योंकि उसका कोड संकलित भी नहीं करता है। – Gabe

+0

हाँ, मार्क के जवाब पोस्ट होने पर मैंने इसके बारे में सोचना बंद कर दिया .. आप सही हैं। – Euphoric

7

ऐसा लगता है कि यदि आप स्पष्ट रूप से EventHandler लागू करते हैं, तो आप घटना को फायर करते समय 'संपत्ति' का संदर्भ नहीं दे सकते। आपको बैकिंग स्टोर का संदर्भ लेना चाहिए।

4

यदि आप किसी व्युत्पन्न कक्षा से ईवेंट को बढ़ाने की कोशिश कर रहे हैं, तो मैं आपकी पोस्ट से नहीं कह सकता हूं, लेकिन मुझे मिली एक बात यह है कि आप बेस क्लास में किसी ईवेंट को परिभाषित नहीं कर सकते हैं और फिर उठा सकते हैं यह (सीधे) एक व्युत्पन्न वर्ग में, किसी कारण से जो अभी तक मुझे स्पष्ट नहीं है। आधार वर्ग में

तो मैं संरक्षित परिभाषित कार्यों इस तरह, घटनाओं (कि जो आधार वर्ग में परिभाषित कर रहे हैं) को बढ़ाने के लिए:

// The signature for a handler of the ProgressStarted event. 
// title: The title/label for a progress dialog/bar. 
// total: The max progress value. 
public delegate void ProgressStartedType(string title, int total); 

// Raised when progress on a potentially long running process is started. 
public event ProgressStartedType ProgressStarted; 

// Used from derived classes to raise ProgressStarted. 
protected void RaiseProgressStarted(string title, int total) { 
    if (ProgressStarted != null) ProgressStarted(title, total); 
} 
फिर व्युत्पन्न वर्ग में

, मैं RaiseProgressStarted (शीर्षक, कुल) फोन के बजाय प्रोग्रेसस्टार्ट (शीर्षक, कुल) को कॉल करने का।

ऐसा लगता है कि यह बहुत लंबा रास्ता है। शायद किसी और को इस समस्या के आसपास एक बेहतर तरीका पता है।

+0

मुझे अभी एहसास हुआ कि यह 5 साल पुरानी पोस्ट है। मैं समस्या से आया और पता लगाया कि मेरे लिए क्या चल रहा था, इसलिए मैंने यह जवाब पोस्ट किया। शायद यह किसी के लिए सहायक होगा। – Shavais

+0

हे, मुझे बस यह समस्या फिर से मिली, मुझे याद नहीं आया कि इसके कारण क्या हुआ और मैं इसे कैसे ठीक कर दूंगा, और 11 महीने पहले से अपना जवाब मिला। यह बहुत मजेदार है। – Shavais

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