Ho bisogno di passare i dati con un evento. Attualmente, quando si ricevono più dati (tramite comport), l'evento si attiva ma l'evento precedente (dati &) non viene ancora gestito, quindi i dati vengono sovrascritti.
Come posso gestire i dati dell'evento & in modo sicuro? Ho più eventi come questo (15x), quindi non sono sicuro che usare una coda per i dati sia il modo migliore o passare i dati insieme all'evento (come l'elemento S.O. 4215845).Passaggio di dati con eventi
Esempio (questo esempio è con una stringa, ma anche utilizzare le matrici, bools etc.):
Al lato 'mittente' (classe 1):
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 contiene i dati e ottiene sovrascritto quando evDiaStringMessage viene attivato troppo presto.
Al lato 'ricevente/GUI' (class2):
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 non contiene i dati previsti (dati precedenti), ma tutti gli eventi sono 'ricevuto'.
Il vostro aiuto è molto apprezzato! Ancora più con un esempio!
Edit:
ho cambiato il codice per:
Sul lato 'mittente' (classe 1):
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);
}
A il lato 'ricevitore/GUI' (classe 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);
}
}
Inizialmente, sostituivo 'EventHandler' di [' EventHandler '] (http://msdn.microsoft.com/en-us/library/db0etb8x.aspx) per dare la possibilità di passare argomenti a gestori di eventi. –