我需要傳遞數據和事件。目前,在接收更多數據時(通過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);
}
}
起初,我會用['EventHandler'](http://msdn.microsoft.com/en-us/library/db0etb8x.aspx)替換'EventHandler',以便將參數傳遞給事件處理程序。 –