मुझे किसी ईवेंट के साथ डेटा पास करने की आवश्यकता है। वर्तमान में, अधिक डेटा प्राप्त करने पर (कॉमपोर्ट के माध्यम से), ईवेंट आग लगेगा लेकिन पिछली घटना (& डेटा) अभी तक संभाली नहीं जा रही है, इसलिए डेटा ओवरराइट हो जाता है।
मैं & डेटा को सुरक्षित तरीके से कैसे संभाल सकता हूं? मेरे पास इस तरह की कई घटनाएं हैं (15x), इसलिए मुझे यकीन नहीं है कि डेटा के लिए कतार का उपयोग करना ईवेंट के साथ सबसे अच्छा तरीका है या डेटा पास करना है (जैसे एसओ आइटम 4215845)।घटनाओं के साथ डेटा पास करना
उदाहरण (इस उदाहरण एक तार के साथ है, लेकिन मैं भी सरणियों, bools आदि का उपयोग करें): 'इस' की ओर (Class1) पर
:
public event EventHandler evDiaStringMessage = delegate { };
private void evDiaStringMessageEvent()
{
evDiaStringMessage(this, new EventArgs());
}
private static string _DiaString;
public string DiaString
{
get { return _DiaString; }
set { _DiaString = value; }
}
DiaString डेटा होता है और हो जाता है evDiaStringMessage को जल्द ही निकाल दिया जाता है जब ओवरराइट किया जाता है।
dia.evDiaStringMessage += new EventHandler(dia_evDiaStringMessage);
private delegate void dia_evDiaStringMessageCallBack(object sender, EventArgs e);
void dia_evDiaStringMessage(object sender, EventArgs e)
{
if (this.InvokeRequired)
{
this.BeginInvoke(new dia_evDiaStringMessageCallBack(dia_evDiaStringMessage), new object[] { sender, e});
}
else
{
frmcomm.CommTextBox("Receiver message: " + dia.DiaString + "\r\n", Color.Red);
}
}
dia.DiaString उम्मीद डेटा (पिछले डेटा) शामिल नहीं है, लेकिन सभी घटनाओं 'प्राप्त' कर रहे हैं:
'रिसीवर/जीयूआई' की ओर (class2) पर।
आपकी मदद बहुत सराहना की है! एक उदाहरण के साथ और भी अधिक!
संपादित करें:
मैं करने के लिए कोड बदल दिया है: (Class1) 'इस' पक्ष में
:
public event EventHandler<DiaStringEventArgs> evDiaStringMessage ;
public class DiaStringEventArgs : EventArgs
{
public string DiaString { get; set; }
}
private void evDiaStringMessageEvent(DiaStringEventArgs e)
{
EventHandler<DiaStringEventArgs> handler = evDiaStringMessage;
if (handler != null)
handler(this, e);
}
...
private void PrepareDataAndFireEvent()
{
DiaStringEventArgs args = new DiaStringEventArgs();
args.DiaString = ByteToString(data);
evDiaStringMessageEvent(args);
}
पर 'रिसीवर/जीयूआई' पक्ष (कक्षा 2):
dia.evDiaStringMessage += new EventHandler<ifDiA10.DiaStringEventArgs>(dia_evDiaStringMessage);
private delegate void dia_evDiaStringMessageCallBack(object sender, ifDiA10.DiaStringEventArgs e);
void dia_evDiaStringMessage(object sender, ifDiA10.DiaStringEventArgs e)
{
if (this.InvokeRequired)
{
this.BeginInvoke(new dia_evDiaStringMessageCallBack(dia_evDiaStringMessage), new object[] { sender, e});
}
else
{
frmcomm.CommTextBox("Receiver message: " + e.DiaString + "\r\n", Color.Red);
}
}
सबसे पहले, मैं 'EventHandler' को' EventHandler '] (http://msdn.microsoft.com/en-us/library/db0etb8x.aspx) द्वारा तर्कों को पारित करने की संभावना देने के लिए प्रतिस्थापित करूंगा घटना हैंडलर। –