2012-11-19 72 views
11

我需要傳遞數據和事件。目前,在接收更多數據時(通過comport),事件將觸發,但之前的事件(&數據)尚未處理,因此數據被覆蓋。
如何以安全的方式處理事件&數據?我有這樣的多個事件(15x),所以我不確定對數據使用隊列是最好的方式還是將數據與事件一起傳遞(如S.O.項目4215845)。通過事件傳遞數據

實施例(該實施例中是一個字符串,但我也使用數組,布爾變量等):

在「發送方」側(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中包含的數據,並得到evDiaStringMessage過早觸發時將被覆蓋。

在 '接收機/ GUI' 側(等級2):

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不包含所期望的數據(以前的數據),但 '接收' 的所有事件。

非常感謝您的幫助!更有一個例子!

編輯:

我改變了代碼:

在 '發件人' 側(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); 
} 

在'接收器/圖形用戶界面'(class2):

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

起初,我會用['Ev​​entHandler '](http://msdn.microsoft.com/en-us/library/db0etb8x.aspx)替換'EventHandler',以便將參數傳遞給事件處理程序。 –

回答

14

您可以將您的數據在自定義EventArgs類:

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

該事件被定義,像這樣:

public event EventHandler<ReceivedDataEventArgs> ReceivedData; 

你的處理程序將採取一個實例類,而不是EventArgs對象,因此你會得到正確的數據。

+0

感謝Jon B和Steve B,那很好! – Ruudster

+0

[有關事件的Microsoft文檔鏈接](https://docs.microsoft.com/en-us/dotnet/standard/events/#event-data) – Alexander

2

當事件發生時,您應該通過dia.DiaString的值,而不是在處理事件時讀回它。

您可以通過擴展EventArgs類和創建自定義屬性來完成此操作。

如果你需要一個例子讓我知道。