2012-11-19 20 views
11

Verileri bir olay ile iletmem gerekiyor. Halihazırda, daha fazla veri (comport üzerinden) alındığında, olay tetiklenecektir, ancak önceki olay (& veri) henüz ele alınmamıştır, dolayısıyla verilerin üzerine yazılacaktır.
Olayı & verilerini güvenli bir şekilde nasıl ele alabilirim? Bunun gibi birden fazla etkinliğim var (15x), bu yüzden veri için bir kuyruk kullanmanın en iyi yol olup olmadığından veya veri ile birlikte veri aktardığından (S.O. madde 4215845 gibi) emin değilim.Verileri olaylarla geçirme

Örnek (Bu örnek, bir dizi ile, ama aynı zamanda diziler, bool değerlerden oluşan vb içinde)

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 verileri içerir ve alır: 'gönderenin yan (sınıfı1)' de

evDiaStringMessage çok yakında tetiklendiğinde üzerine yazılır.

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 beklenen verileri (önceki veriler) içermez, ancak tüm olayları '' Alınan edilmiştir: 'alıcı/GUI' yan (Ders2) 'de

.

Yardımınız çok takdir edilmektedir! Bir örnekle daha da fazlası!

Düzenleme: 'gönderici' tarafında (sınıfı1)

: Ben kodu değişti

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

At 'alıcı/GUI' tarafı (sınıf 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

Öncelikle, argümanları iletme olasılığını vermek için 'EventHandler '[EventHandler '] (http://msdn.microsoft.com/en-us/library/db0etb8x.aspx) yerine" EventHandler "i değiştiririm. etkinlik sahipleri. –

cevap

14

Özel bir EventArgs sınıfta verilerinizi saklayabilirsiniz:

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

olay şöyle tanımlanır:

public event EventHandler<ReceivedDataEventArgs> ReceivedData; 

Kişisel işleyicisi yerine EventArgs nesnenin örneğine de sınıfınızı alacak ve dolayısıyla doğru verilere sahip olacaksınız.

+0

Teşekkürler Jon B ve Steve B, bu güzel çalışıyor! – Ruudster

+0

[Olaylarla ilgili Microsoft belgelerine bağlantı] (https://docs.microsoft.com/en-us/dotnet/standard/events/#event-data) – Alexander

2

Olay yürütüldüğünde geri okumak yerine olay yükseltildiğinde dia.DiaString değerini geçmelisiniz.

Bunu, EventArgs sınıfını genişleterek ve özel özellikler oluşturarak yapabilirsiniz.

Örnek vermek isterseniz bana bildirin.