イベントでデータを渡す必要があります。現在、(comportを介して)より多くのデータを受信すると、イベントは発生しますが、前のイベント(&data)はまだ処理されていないため、データは上書きされます。
イベントとデータを安全に処理するにはどうすればよいですか?このような複数のイベント(15x)があるので、データにキューを使用するのが最善の方法なのか、イベントと一緒にデータを渡すのか(SOアイテム4215845など)はわかりません。
例(この例は文字列を使用していますが、配列、boolなども使用しています):
「送信者」側(class1):
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には期待されるデータ(以前のデータ)は含まれていませんが、すべてのイベントが「受信」されています。
あなたの助けは大歓迎です!例を挙げればさらに!
編集:
コードを次のように変更しました。
「送信者」側(class1):
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);
}
'レシーバー/GUI'側(クラス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);
}
}