2012-11-19 8 views
11

イベントでデータを渡す必要があります。現在、より多くのデータ(comport経由)を受け取ると、イベントは発生しますが、前のイベント(&データ)はまだ処理されないので、データは上書きされます。
イベント&のデータを安全に処理するにはどうすればよいですか?私はこのような複数のイベント(15x)を持っているので、データのキューを使用するのが最良の方法であるかどうか、またはイベント(データ項目4215845など)とともにデータを渡すかどうかはわかりません。イベントでデータを渡す

例(この例では、文字列であるが、私はまた、アレイ、boolsなどを使用する):「送信者側(クラス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); 
} 

'レシーバ/ 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を['EventHandler '](http://msdn.microsoft.com/en-us/library/db0etb8x.aspx)に置き換えて、引数を渡す可能性を与えますイベントハンドラ。 –

答えて

14

カスタムのEventArgsクラスにデータを保存することができます

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

イベントはそうのように定義されています。

public event EventHandler<ReceivedDataEventArgs> ReceivedData; 

あなたのハンドラは、インスタンスクラスの代わりに、EventArgs対象になりますあなたは正しいデータを持っています。

+0

ジョーンBとスティーブB、ありがとう! – Ruudster

+0

[イベントに関するMicrosoftのドキュメントへのリンク](https://docs.microsoft.com/en-us/dotnet/standard/events/#event-data) – Alexander

2

イベントが処理されたときに読み戻すのではなく、イベントが発生した場合は、値dia.DiaStringを渡す必要があります。

これは、EventArgsクラスを拡張してカスタムプロパティを作成することで実行できます。

例が必要な場合はお知らせください。

関連する問題