이벤트와 함께 데이터를 전달해야합니다. 현재 (comport를 통해) 더 많은 데이터를 수신하면 이벤트가 실행되지만 이전 이벤트 (& 데이터)는 아직 처리되지 않으므로 데이터를 덮어 씁니다.
& 이벤트를 안전하게 처리하려면 어떻게해야합니까? 이처럼 여러 이벤트 (15x)가 있으므로 데이터 대기열을 사용하는 것이 데이터와 이벤트 (예 : S.O. 항목 4215845)를 함께 전달하는지 잘 모르겠습니다.이벤트로 데이터 전달
예 (이 예에서는 문자열이지만, 또한 어레이 bools 등 사용)
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 데이터를 포함하고, 취득 다음 '발신자 측 (클래스 1)에
을 evDiaStringMessage가 너무 빨리 시작되면 덮어 씁니다.
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가 예상 데이터 (이전 데이터)를 포함하지 않지만, 모든 이벤트는 '수신'과 같다 : '수신기/GUI'면 (Class2의)에서
.
귀하의 도움에 감사드립니다. 예를 들어 더 많이!
편집 : '발신자 측에서 (클래스 1)
: I가 코드를 변경
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'측 (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'를 대체합니다. 이벤트 핸들러. –