मैंने .NET 4.0 में विशेष रूप से संभावित बहु-थ्रेडेड परिदृश्यों में एक नई प्रवृत्ति देखी है, जो घटनाओं से परहेज कर रहा है, और इसके बजाय ग्राहक विधियां प्रदान कर रहा है।सब्सक्राइबर विधि बनाम घटना
उदाहरण के लिए, System.Threading.Tasks.Task और Task<TResult>
में पूर्ण या समाप्त घटना के बजाय ContinueWith() विधियां हैं। एक और उदाहरण System.Threading.CancellationToken है: इसमें Register() विधि रद्द करने की आवश्यकता के बजाय विधि है।
जबकि Task.ContinueWith() तार्किक है, क्योंकि यह (घटनाओं के साथ इतना सुंदर नहीं होगा) आसान काम श्रृंखलन के लिए अनुमति देता है, और यह भी (क्योंकि इस तरह से, Task<TResult>
उचित भार के प्रदान कर सकते हैं Task<TResult>
Task
से विरासत के लिए अनुमति देता है कि, जो किसी ईवेंट के लिए संभव नहीं होगा: यदि आपके पास कोई ईवेंट इवेंट हैडलर कार्य में समाप्त हुआ है, तो आप अन्य ईवेंट बना सकते हैं, कहें, ईवेंट EventHandler<TaskResultEventArgs>
Task<TResult>
में समाप्त हुआ, जो बहुत अच्छा नहीं है), लेकिन मुझे नहीं मिल रहा है रद्दीकरण टोकन के लिए एक ही स्पष्टीकरण। रजिस्ट्रार()।
तो, इसी तरह के परिदृश्यों में घटनाओं के नुकसान क्या हैं? क्या मुझे इस पैटर्न का भी पालन करना चाहिए? स्पष्टीकरण के लिए, नीचे दिए गए में से कौन सा मुझे चुनना चाहिए? मुझे दूसरे के खिलाफ कब पसंद करना चाहिए?
public event EventHandler Finished;
// or
public IDisposable OnFinished(Action continuation)
बहुत बहुत धन्यवाद!
@ जोन स्कीट: धन्यवाद, मैंने यह नहीं देखा कि मेरे परी ब्रैकेट को कुछ भागने की आवश्यकता है। – ShdNx
यूआई इवेंट इत्यादि को यूआई संदेश कतार का उपयोग करके पोस्ट किया जा सकता है और संभावित रूप से एक प्रतिनिधि या साधारण कार्य का उपयोग करने की तुलना में वास्तव में धीमी/भारी हो सकती है .. – CodingBarfield
@ बरफील्डएमवी: एक्शन कॉल को उसी तकनीक का उपयोग करके पोस्ट किया जा सकता है जिसमें Invoke/BeginInvoke के साथ यूआई धागा यह अंतर नहीं है। –