2012-11-19 4 views
11

이벤트와 함께 데이터를 전달해야합니다. 현재 (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); 
    } 
} 
+0

처음에는 인수를 전달할 가능성을주기 위해 [EventHandler '] (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 클래스를 확장하고 사용자 지정 속성을 만들면이 작업을 수행 할 수 있습니다.

예제가 필요하면 알려주십시오.