मेरे पास .NET प्रतिनिधियों के बारे में एक साधारण सवाल है।सी # प्रतिनिधियों, संदर्भ संकल्प समय
public void Invoke(Action<T> action)
{
Invoke(() => action(this.Value));
}
public void Invoke(Action action)
{
m_TaskQueue.Enqueue(action);
}
पहले समारोह this.Value
के लिए एक संदर्भ encloses: मैं कुछ इस तरह है कहो। रनटाइम के दौरान, जब पहली, जेनेरिक पैरामीटर के साथ विधि कहा जाता है, तो यह किसी अन्य तरीके से this.Value
प्रदान करेगा, लेकिन कैसे? ये मेरे मन में आया:
- मूल्य (struct) द्वारा कॉल -
this.Value
के वर्तमान मूल्य से पारित कर दिया जाता है, इसलिए यदिm_TaskQueue
यह 5 मिनट बाद कार्यान्वित करता है, मूल्य हाल ही में अपनी स्थिति में नहीं जाएगा, यह पहली बार संदर्भित होने पर यह भी होगा। - संदर्भ द्वारा कॉल (संदर्भ प्रकार) - तो
Value
का सबसे हाल ही राज्य कार्रवाई के निष्पादन के दौरान संदर्भित किया जाएगा, लेकिन अगर मैं कार्रवाई के क्रियान्वयन से पहले एक और संदर्भ के लिएthis.Value
बदलने के लिए, यह अभी भी पुराने संदर्भ की ओर इशारा करते हो जाएगा
- नाम से कॉल करें (दोनों) - जहां
this.Value
का मूल्यांकन किया जाएगा जब कार्रवाई कहलाती है। मेरा मानना है कि वास्तविक कार्यान्वयनthis
का संदर्भ रखेगा, फिर उस प्रतिनिधि के वास्तविक निष्पादन के दौरानValue
का मूल्यांकन करें क्योंकि नाम से कोई कॉल नहीं है।
मुझे लगता है कि यह नाम शैली का कॉल होगा लेकिन कोई दस्तावेज नहीं मिला है, इसलिए यह सोच रहा है कि यह एक अच्छी तरह से परिभाषित व्यवहार है या नहीं। यह वर्ग स्कैला या एरलांग में एक अभिनेता की तरह कुछ है इसलिए मुझे इसे थ्रेड सुरक्षित होने की आवश्यकता है। मैं Invoke
फ़ंक्शन को Value
पर फ़्रेज़ करने के लिए तत्पर नहीं चाहता हूं, जो this
ऑब्जेक्ट m_TaskQueue
द्वारा सुरक्षित थ्रेड में किया जाएगा।
बहुत धन्यवाद, यह बहुत है क्रिस्टल अब स्पष्ट :) –