2012-11-19 11 views
11

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); 
    } 
} 
+0

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. –

risposta

14

È possibile memorizzare i dati in una classe EventArgs personalizzati:

public class ReceivedDataEventArgs : EventArgs 
{ 
    // Add the properties you require 
} 

L'evento è definita in questo modo:

public event EventHandler<ReceivedDataEventArgs> ReceivedData; 

vostro gestore avrà in un'istanza tua classe invece dell'oggetto EventArgs e quindi avrai i dati corretti.

+0

Grazie Jon B e Steve B, che funziona bene! – Ruudster

+0

[collegamento alla documentazione Microsoft relativa agli eventi] (https://docs.microsoft.com/en-us/dotnet/standard/events/#event-data) – Alexander

2

È necessario passare il valore di dia.DiaString quando l'evento viene generato anziché ricontrollarlo quando l'evento viene gestito.

Si può fare questo estendendo la classe EventArgs e la creazione di proprietà personalizzate.

Se hai bisogno di un esempio fammi sapere.

Problemi correlati