आप ईवेंट हैंडलर कॉलबैक में अतिरिक्त पैरामीटर पास नहीं कर सकते हैं, क्योंकि आप इसे कॉल करने वाले नहीं हैं - टाइमर है; कि पूरे मुद्दे ;-)
है लेकिन, आप आसानी से एक बंद के साथ एक ही प्रभाव को पूरा कर सकते हैं:
private void btnAutoSend_Click(object sender, EventArgs e)
{
timer.Elapsed += (timerSender, timerEvent) => send(timerSender, timerEvent, receiver);
timer.AutoReset = true;
timer.Enabled = true;
}
public void send(object source, System.Timers.ElapsedEventArgs e, string receiver)
{
this.rtbMsg.AppendText("psyche-->" + receiver + ": hello\n");
}
अब बीत चुके हैंडलर (timerSender, timerEvent) =>
लैम्ब्डा कार्रवाई है, जो receiver
से अधिक चर बंद कर देता है और कहता है send
जब भी लैम्ब्डा ट्रिगर होता है तो अतिरिक्त पैरामीटर के साथ मैन्युअल रूप से।
अपने विशेष मामले में आपको प्रेषक या तर्क की आवश्यकता नहीं है, इसलिए उन्हें अग्रेषित करने की कोई आवश्यकता नहीं है। कोड बन जाता है:
private void btnAutoSend_Click(object sender, EventArgs e)
{
timer.Elapsed += (s_, e_) => OnTimerElapsed(receiver);
timer.AutoReset = true;
timer.Enabled = true;
}
private void OnTimerElapsed(string receiver)
{
this.rtbMsg.AppendText("psyche-->" + receiver + ": hello\n");
}
यदि आप इन सब के ऊपर के बारे में सोच रहे हैं, तो यह बहुत कम है। लैम्ब्डास सिर्फ सिंटैक्टिक चीनी हैं और दृश्यों के पीछे सादे कार्य हैं (घटना सामग्री के लिए कुछ स्वचालित प्रतिनिधि लपेटने के साथ)। क्लोजर-जेनरेटेड क्लासेस का उपयोग करके क्लोजर लागू किए जाते हैं, लेकिन जब तक आपके पास वास्तव में टन नहीं है तब तक आपको कोई कोड ब्लोट नहीं दिखाई देगा।
जैसा कि टिप्पणियों में बताया गया है, आप OnTimerElapsed
कोड में यूआई तत्व तक पहुंचने लगते हैं - चूंकि आप विंडोज फॉर्म टाइमर का उपयोग नहीं कर रहे हैं, इसलिए एक अच्छा मौका है कि आप इसे करने के बाद अपवाद प्राप्त करेंगे यह कोड उस घटना को चलाएगा जब टाइमर घटना को सक्रिय करता है, और विंडोज में यूआई नियंत्रण को केवल तक बनाए गए थ्रेड से एक्सेस किया जाना चाहिए।
आप कर सकते थे गंदगी के आसपास this.Invoke
साथ इसे मैन्युअल रूप से ठीक करने के लिए, लेकिन यह टाइमर मार्शल SynchronizingObject
property के माध्यम से आप के लिए सही धागा करने के लिए घटना के लिए आसान है:
private void btnAutoSend_Click(object sender, EventArgs e)
{
timer.SynchronizingObject = this; // Assumes `this` implements ISynchronizeInvoke
timer.Elapsed += (s_, e_) => OnTimerElapsed(receiver);
timer.AutoReset = true;
timer.Enabled = true;
}
अंत में, एक और से प्रेरित टिप्पणी, यहां एक और तरीका है कि आप बंद करने के संदर्भ को संग्रहीत कर सकते हैं ताकि आप बाद में घटना से सदस्यता समाप्त कर सकें:
private void btnAutoSend_Click(object sender, EventArgs e)
{
timer.SynchronizingObject = this; // Assumes `this` implements ISynchronizeInvoke
ElapsedEventHandler onElapsed;
onElapsed = (s_, e_) => {
timer.Elapsed -= onElapsed; // Clean up after firing
OnTimerElapsed(receiver);
};
timer.Elapsed += onElapsed;
timer.AutoReset = true;
timer.Enabled = true;
}
ठीक है, आप 'System.Windows.Forms.Timer' उपयोग करें यदि आप पुस्तकालय के लिए एक संदर्भ जोड़ सकते हैं। – annonymously
संबंधित [system.timers.timer पर प्रेषक पैरामीटर को कैसे पास करें] (http://stackoverflow.com/questions/6368399/how-to-pass-the-the-sender-parameter-to-the- सिस्टम -टिमर्स-टाइमर) – Damith
आपको किसी भी यूआई घटकों के साथ System.Windows.Timer का उपयोग नहीं करना चाहिए (उदाहरण के लिए rtbMsg.AppendText संभवतः कुछ प्रकार के विंडोज नियंत्रण तक पहुंच सकता है), System.Timer.Elapsed को गैर UI थ्रेड पर कॉल किया जाता है और इसका कारण बनता है ज्यादातर मामलों में एक अपवाद। यदि आप WinForms नहीं हैं और WPF हैं, तो आप एक डिस्पैच टाइमर का उपयोग करना चाहेंगे। यदि आप स्पष्ट कर सकते हैं कि आपको कौन सी त्रुटि मिल रही है, तो कोई अधिक सटीक सलाह प्रदान करने में सक्षम हो सकता है। –