मेरी पिछली कुछ परियोजनाओं पर मैंने परिस्थितियों में भाग लिया है जहां मुझे Threading.Timer
कॉलबैक विधि में एकाधिक पैरामीटर पारित करने की आवश्यकता है। दुर्भाग्य से, कन्स्ट्रक्टर केवल एक object
पैरामीटर स्वीकार करता है। वैश्विक चर का उपयोग नहीं करना चाहते हैं, इस समस्या को दूर करने के लिए मैंने जिस पैटर्न का उपयोग शुरू किया है, वह टाइमर बनने पर एक अज्ञात विधि में गुजरना है और मेरे लाभ के लिए चर को कैप्चर करने के लिए कंपाइलर की क्षमता का उपयोग करना है, जैसे:थ्रेडिंग टिमर कॉलबैक विधि में एकाधिक पैरामीटर पास करने का सबसे अच्छा तरीका क्या है?
public void SendEmailsRepeatedly(IEnumerable<SimpleEmail> emails, int sendRepeatedlyDelayMS)
{
Tokenizer tokenizer = new StandardTokenizer();
sendRepeatedlyTimer = new Timer(
SendRepeatedlyCallback,
(Action)delegate()
{
TokenizeAndSendEmails(emails, tokenizer);
},
0,
sendRepeatedlyDelayMS);
}
private void SendRepeatedlyCallback(object state)
{
if (!abort)
{
Action sendEmails = (Action)state;
sendEmails();
}
}
तो मेरा सवाल है, क्या यह एक प्रमुख हैक है? क्या ऐसा करने के लिए कोई बेहतर या अनुशंसित तरीका है?
मैं इसे आपको देने जा रहा हूं क्योंकि यह शायद सबसे अधिक "पठनीय" दृष्टिकोण है, और मुझे यकीन है कि मेरे सहकर्मी पहले से ही मेरे अधिकांश कोड के साथ काफी उलझन में हैं। –
मुझे इसमें कोई लाभ नहीं दिख रहा है। जब संकलक आपके लिए यह बॉयलरप्लेट काम कर सकता है तो खुद को कक्षा क्यों बनाएं? –
@ जोन आपके पास एक बिंदु है और मैं कंपाइलर के साथ धातु को पेडल को धक्का देने का भी प्रशंसक हूं। हालांकि मुझे यह भी लगता है कि कुछ स्थितियां हैं जहां कोड को थोड़ा अधिक वर्बोज़ बनाना अच्छा होता है ताकि अन्य लोग बिना किसी कठिनाई के इसे समझ सकें। इसके विपरीत, यह तर्क दिया जा सकता है कि मुझे और अधिक इनलाइन टिप्पणियां जोड़नी चाहिए। –